|
2016/02/19(Fri) 10:05:07 編集(投稿者)
StackOverFlowが起きるのって、現実的にどういうとき? 1) 巨大な複数次元配列を定義した 2) 再帰呼び出しを伴うプログラムにおいて再帰呼び出しが深くなりすぎた 3) メッセージやイベントを介して無限呼び出しがおきる場合 : いろんなパターンがありますが、よく聞くのはこのパターン。
1)なら、その配列を定義した場所が問題であり、ヒープメモリに置き換えようと いうことです(new []とか)。
2) は、再帰呼び出しの脱出口の用意に失敗して、事実上の無限ループになって いるケースが多いです。だから、実際にStackOverFlowが発生している場所、つ まり関数呼び出しにはなんの問題も無いので、例外が発生した場所を調べても無 意味です。 なぜ、無限ループに陥っているのか(再帰呼び出しを脱出できないのか?)を調べ ましょう。
2)が正常系で起きる場合もあります。 この場合は、本当に正常系で資源を食い尽くしているので、小手先で修正するこ とは不可能です。 私も以前、このパターンにはまったことがあり、 再帰呼び出しだったコードをアルゴリズムから見直して、非再帰呼び出し型に変 換して直しました。苦労した(笑)
3) は2)の特殊系です。 たとえば、 ・コンボボックスのリスト選択イベントの中で、リストを再選択 ・再選択したからイベントが発生 ・コンボボックスのリスト選択イベントの中で、リストを再選択 : (以下、無限ループ) といった具合です。
結論として、何が言いたいかというとStackOverFlowはそれが起きている場所に 原因が無いことが多いので、 > (例外が発生した関数、行番号など) は知ることにあまり意味が無いと。
で、2) 3)の場合、無限ループでも正常系でも「呼び出し履歴」に同じメソッド の呼び出し履歴がたくさん残ります。 それが目印になるよと、774RRさんもそのようにおっしゃっているわけです。
|