2013-08-27 6 views
8

好奇心が強い。 In an answer StackOverflowErrorsを捕まえようとしています。「スタックオーバーフローによって、アプリケーションがメモリが枯渇したように矛盾する状況が生じることは間違いありません。 StackOverflowErrorsでは、バグの場合にスローされるNullPointerException以上にアプリケーションの状態を破壊する恐れがあるため、特別な点は何ですか?私が考えることのできることの1つは、StackOverflowErrorは通常例外(または他のThrowable、そのような問題)がスローされることのない場所(たとえば単純なゲッター)で発生する可能性があるためです。もっと悪魔的な問題はありますか?StackOverflowErrorをキャッチする際の害は何ですか?

+1

私は、データエラーではなくコーディングエラーのためにSOEが通常発生すると考えています。他のコメントは、「スタックオーバーフローエラーは通常バグですが、通常はNPEではありませんか? –

+0

@ user2310289 NPEにはさまざまな方法があります。多くの場合、いくつかのテストをスキップして、try/catchシステムに時々頼ることがあります。しかし、はい、NPEをキャッチすることも珍しいはずです。 –

+1

これはエラーです。例外ではありません! –

答えて

10

スタックオーバーフローエラーは、メモリが使い果たされたことを意味するものではなく、メモリ自体が矛盾するものではありません。

しかし、スタックオーバーフローエラーは通常バグです。例外をキャッチするのではなく、バグを修正する必要があります。バグを隠すために例外システムを使用しないでください。

スタックが深すぎる(グラフの探索など)危険性がある場合でも、スタックを爆発させるよりも、それを制御する方が良い方法があります。 the Javadoc of the Error superclassから

エラーは、合理的なアプリケーションがキャッチすべきではないという重大な問題を 示すThrowableのサブクラスです。そのようなほとんどの は、異常な状態です。 ThreadDeathエラーは、 の「通常の」状態ですが、ほとんどの アプリケーションがそれをキャッチしようとするべきではないため、Errorのサブクラスです。

+0

面白いことは...あなたは実際にこのエラーをキャッチすることはできません。何かできるようになる前にVMがクラッシュします。 –

+1

@PaulNikonowicz - 実際には、JVMが適切に実装されていれば、それを捕まえることができます。あなたは、ハンドラが何をする必要があるかを行うのに十分なスタックスペースがあることを十分に把握する必要があります。 –

+0

本当にOutOfMemoryErrorだったとしても、何が矛盾しているのでしょうか?例外を引き起こす他のバグよりも多くのことがありますか? BTW:まともなアプリケーションでは、エンドユーザにスタックトレースを提示するのを避けるために、アプリケーションのトップレベルのどこかでエラーを含むすべてをキャッチする必要があります。 –

0

エラーがゆえ をキャッチすべきではない重大な問題である。この方法は、あなたが

スロー-句を宣言する必要はありません、エラーをスローした場合も、スーパークラス(のThrowable) をキャッチしていません

アプリケーションの動作がエラー 後、多くの場合、予測できない - にStackOverflowErrorがスローされた場合、エラーがそう異常

を示し、アプリケーションは今のスタックの場所の最大値に達しました。あなたのアプリケーションを再チェックして、ガベージコレクタが早く

+0

答えをありがとう。私はガベージコレクタがこれと何をしなければならないかはよく分かりません。とにかく - 私の質問は、SOEが私が質問に示したより悪い結果をもたらすことができるかどうかだった。 –

関連する問題