1. ホーム
  2. java

[解決済み] StackOverflowErrorとは何ですか?

2022-03-21 11:24:59

質問

とは何ですか? StackOverflowError また、その原因や対処法についても教えてください。

解決方法は?

パラメータとローカル変数の割り当ては スタック (参照型の場合、オブジェクトは ヒープ で、スタック内の変数がヒープ上のそのオブジェクトを参照する)。スタックは通常 アッパー のアドレス空間の端にあり、使い切ると ボトム のアドレス空間(つまり、ゼロの方向)。

また、あなたのプロセスは ヒープ に住んでいます。 ボトム プロセスの末尾に位置します。メモリを割り当てると、このヒープがアドレス空間の上端に向かって大きくなっていきます。このように、ヒープが大きくなる可能性があります。 衝突します。 とスタック(ちょっと地殻変動に似ている!!)の間に挟まれます。

スタックオーバーフローの一般的な原因は 悪い再帰呼び出し . 一般的には、再帰関数が正しい終了条件を持っていないために、永遠に自分自身を呼び出し続けることになる場合に起こります。また、終了条件が正しい場合でも、それを満たすまでにあまりにも多くの再帰的呼び出しを必要とすることが原因である場合もあります。

しかし、GUIプログラミングを用いると、このように 間接再帰 . 例えば、アプリケーションがペイントメッセージを処理している間に、システムが別のペイントメッセージを送信するための関数を呼び出すことがあります。これは、あなた自身が明示的に呼び出したのではなく、OS/VMがあなたの代わりに呼び出したのです。

これに対処するためには、自分のコードを調べる必要があります。もし、自分自身を呼び出す関数があるのなら、終了条件があるかどうかチェックしてください。そうでなければ、再帰的に呼び出された関数に目に見える変化はなく、終了条件は役に立ちません。また、有効な終了条件に達する前にスタックスペースが不足する可能性があることに注意してください。

明らかに再帰的な関数がない場合、次のようなライブラリ関数を呼び出していないか確認してください。 間接的に が呼び出されることになります (上記の暗黙の了解のような場合)。