StackOverflowException について

初級者向けにおさらいします。

目次

この例外エラーの説明

Stack Overflow(スタック(入れ物)がいっぱいになって、ついにはあふれ出てしまうことで発生する)Exception です。コップの水みたいなイメージです。通常、メソッドは呼ばれた際、元の位置に戻るために目印をつけておきます。この目印用の容器の大きさを超えたメソッド呼び出しが行われると発生します。だいたいは再起呼び出し処理の設計ミスで発生します。

事例とその対処方法

例外エラーは、想定外の扱われ方をすると発生して飛んで来ます。それは命令の使い方が間違っていたり、存在しないデータを扱おうとしていたり、アカウント権限を越えたアクセスをしようとしていたり(Windows 側やウェブ側の話だったり)、サービスが動いていないのに連携しようとしたり、製品上の仕様考慮モレだったり、そういう系です。

こうなっている前提のはずだから、こうやろうとしたのに、実際はここがこうなっているからダメじゃん!こういう場合の処理が無いじゃん!みたいなコードになっていませんか?

再帰メソッド

自分自身を呼び出すメソッドのことを再帰処理と言います。例えば以下のようなメソッドのことです。

Private Sub GetData(i As Integer)
    GetData(i)
End Sub

Sub Main()

    GetData(12)


    Console.ReadKey()
End Sub
System.StackOverflowException: '種類 'System.StackOverflowException' の例外がスローされました。'

再帰処理では、必ずメソッドから抜け出すための条件分岐処理(ある値の時に再起呼び出しをしないコード)を含める必要があります。以下は数学の階乗計算をおこなうメソッドです。2以上の場合は、その数xその数-1を返却、1の場合は1を返却します。

Private Function Kaijo(i As Integer) As Integer

    If i = 1 Then
        Return 1
    Else
        Return i * Kaijo(i - 1)
    End If

End Function

Sub Main()

    ' 階乗計算(例えば、3!=3x2x1=6)
    Dim result As Integer = Kaijo(3)
    Console.WriteLine(result)

    result = Kaijo(8)
    Console.WriteLine(result)


    Console.ReadKey()
End Sub
6
40320

再帰処理は、ツリー構造、例えばxmlデータの探索、フォルダの探索、TreeView コントロールなどで多く使われます。イメージするのが難しい技術ですので経験が必要かもしれません。