VB のたまご

作成日: 2015/12/03, 更新日: 2015/12/03


StackOverflowException について

概要

  •  StackOverflowException は、Stack(スタック、入れ物)に入れようとした時に、もう満杯で入らないのに入れようとして発生する例外エラーです。
  •  スタックというのは入れ物のことです。 プログラムがメソッドを呼び出した時、 メソッドの中に入って、処理をして、元の場所に戻ってこられるのは、 スタックに、戻る場所を登録して忘れないようにしておくからです。
  •  通常は、スタックの空きに余裕があるのですが、メソッド呼び出しが多すぎると、スタックが満杯になりあふれてしまいます。 このようなことになるのは、ほとんどが再帰処理の設計ミスで、無限にメソッド呼び出しをし続けてしまい、本例外エラーが発生するというパターンに陥ってしまいます。


スポンサーリンク


事例と対処方法

  •  以下のサンプルは、意図的に例外エラーを発生させるコードです。 実際の業務プログラムでは、このような簡単なコードではないと思いますが、例外発生させている、直接的な原因となる部分として参考になるはずです。 また、本例外エラーが発生してしまう原因となった、根本的な原因となる別の例外エラーが、さらに奥深くにいる場合があります。 (本例外エラーは間接的に影響を受けて発生してしまったもので、本当の原因となる例外エラーを食い止めることで、本例外エラーも直る場合があります。)

  •  このような組み合わせのパターンは、本例外エラーに限らず、他の例外エラー全般にも言えることですが、そんなに頻繁に出くわすものではないと思いますので、 そういう場合もあるということだけ、覚えておいていただけると解決しやすくなるのではと思います。

  •  また、記載の対処方法は、あくまでも一例です。 他の対処方法の方が、その業務プログラムにとってベストプラクティスとなる場合もありますので、検討材料の1つという程度に確認していただければと思います。

  • スポンサーリンク



  • 再帰処理
  • Me.GetData(12)
    
    Private Sub GetData(i As Integer)
        Me.GetData(i)
    End Sub
    
    ' 例外エラー
    型 'System.StackOverflowException' のハンドルされていない例外が 'xxx' で発生しました
    
    ' 対処方法
    Private Sub GetData(i As Integer)
        If i = 0 Then
            Exit Sub
        End If
        i -= 1
        Me.GetData(i)
    End Sub
    
  •  必ず処理内に、メソッドから抜け出すための命令を組み込みます。 目的となるデータ取得、加工処理ばかりに気を取られがちですが、無限呼び出しになった場合にどう対処するか、ということも考慮が必要です。 意図的な無限ループを実装する際も同様で、目的を実現させる処理以外に、必ず抜け道専用の命令を組み込むことが大事です。

  •  最後までこの記事を読んでいただき、ありがとうございました。

  • スポンサーリンク