踊る大捜査線のように「レインボーブリッジ封鎖できませ~~~ん」と、つぶやいたか、つぶやかなかったかは記憶がありませんが、「例外捕捉できませ~ん」と、近くでバカが騒いでいます。そして今回、Exception を catch しているのに、その位置を通ることなくアプリケーションがお亡くなりになっている、その調査の役目が回ってきました。あー、うざい。なんでおいらが・・・
スポンサーリンク
java.lang.OufOfMemoryError : Java heap space
例外が捕捉できない理由は割とすぐに判明しました。Java では、Exception ではなく、捕捉すべきでない Error というものが存在してました(知りませんでしたけど)。
そして、エラーの原因は、数百万件におよぶ SQL のクエリ結果をメモリに格納しようとして発生していました。エラーの内容のとおりヒープ領域が単純になくなったようです。
次にエラーの捕捉ですが、たとえば次のように記述すると Exception だけではなく Error も捕捉できるようになります。
try { /* 何か処理 */ } catch (Exception ex) { /* 例外捕捉 */ } catch (Error err) { /* エラー捕捉 */ }
Exception と Error クラスの関係は、どちらも Throwable クラスを継承しています。そう、兄弟なのです。どちらがお兄ちゃんかは内緒です。
- Throwable
- Exception
- Error
注意!!
JavaDoc には、Error を捕捉するということは、人間のクズのやることだと思っていただきたいと記述されていますので、「漠然と心配だから」「なんとなく念のため」との思いから、Error を捕捉するようなことはやめたほうが良いでしょう。
例えば、今回のように、ヒープ領域がなくなったとあるのに、catch の中で、new とかして、また、ヒープ領域を取得しようとすることは、間違いであることがわかると思います。