Webアプリケーションを作成中、サーバーからの応答が無いという事象が発生した。
普通、サーバーからの応答が無い場合はプログラムのどこかで無限ループに陥っている可能性が高い。
ざっとソースを見た限り、for文もwhile文も無限ループになるような記述をしていない。
無限ループを起こしている箇所がどうしても思い当たらないため、デバックモードで実行しログをみてみた。
すると、jspでjavabeanを呼び出しているときに無限ループが発生していることがわかった。
無限ループを起こしているjavabeanのソースを見ていると
public String getHoge(){
return this.getHoge();
}
と記述している箇所があった。return this.getHoge();
}
どうやら、インスタンスフィールドをreturnするメソッドで、誤ってメソッド自身を呼び出す処理を書いてしまったらしい。
文法的には間違った書き方ではない
が、再帰の脱出条件が無いため結果的に
while(true){・・・・}
と同じ処理をしていることになる。無限ループが起こると、ループ文を真っ先に疑うのは定石だろう。
だが、再帰処理でも無限ループが発生することがある。
意図して再帰処理を書いたなら、再帰処理が無限ループの原因だと思いつくかもしれない。
だが、意図しない再帰処理、
例えば、コード保管機能でインスタンスフィールドを選ぶつもりがインスタンスメソッドを選んでしまった。
場合はなかなか無限ループの原因が特定できないかもしれない。
無限ループが発生してなかなか原因がつかめない場合、"意図しない再帰呼び出し"も疑ってみてはどうだろうか?