2009-12-11 34 views
8

Java Webアプリケーションに、java.lang.OutOfMemoryError:Javaヒープスペース例外を発生させるスレッドがありますが、try/catchブロックはエラーをキャッチしません。「java.lang.OutOfMemoryError:Java heap space」がキャッチされないのはなぜですか?

サンプルコード:

private void doSomeWork() 
{ 
    try 
    { 
     processData(); //Causes OutOfMemoryError 
     System.out.println("This line does not execute"); 
    } 
    catch (Exception e) 
    { 
     System.out.println("Exception. This line does not execute."); 
     //Log error 
    } 
    finally 
    { 
     System.out.println("finally. This line does execute"); 
     System.out.println("Thread name: " + Thread.currentThread().getName()); 

    } 
} 

出力:

 
finally. This line does execute 
Thread name: _Worker-8 
Exception in thread "_Worker-8" java.lang.OutOfMemoryError: Java heap space 
...

背景:

私は最近、このJavaプロジェクトを引き継いだと私は取得しようとしていますJavaとこのプロジェクトでスピードをあげる。私はC#開発者なので、このプロジェクトやJavaにはまだ慣れていません。 -Xmx設定を使用してエラーを修正できますが、このエラーをキャッチしてログに記録することに興味があります。エラーはいずれのログファイルにも表示されず、出力はEclipseのデバッグモードでコンソールに表示されます。

答えて

39

OutOfMemoryErrorErrorであるため、Exceptionではありません。 OutOfMemoryErrorExceptionのサブクラスではないため、catch (Exception e)は適用されません。

OutOfMemoryErrorThrowableになりますので、キャッチする必要があります。ここにはSO discussionがあります。一般的には、何もできないので、プロダクションコードのエラーを捕まえることをお勧めします。しかし、何が起こっているのかをデバッグしようとしている特別なケースを考えれば、それは役に立つかもしれません。

+0

リンク参照の良い回答。私はそれを感謝します、ありがとう! – Crispy

+2

あなたのアプリケーションの最も外側の部分(またはスレッドメソッドの最も外側の部分)にthrowableをキャッチすることをお勧めします。なぜなら、あなたのプログラムがなぜ中止されたのかを実際に知ることができるからです)。 –

3

"〜エラー"は "〜例外"ではありません。

あなたは "エラー" または "Throwableの"

2

例外は、直接のThrowableを拡張しながら、OutOfMemoryErrorが発生がないVirtualMachineErrorを拡張をキャッチする必要があります。したがって、Javaの仕様に従って捕捉されているわけではありません。すべての例外をキャッチする場合は、catch(Throwable e)をその句に追加してください。

+0

より正確にはOutOfMemoryErrorはErrorを拡張するVirtualMachineErrorを拡張し、エラーは例外ではないためcatch(Exception)はキャッチできません – chburd

+0

Bingo。木全体をリストすると思ったが、怠け者になった:) – Daniil

11

java.lang.OutOfMemoryErrorはjava.lang.Exceptionを拡張しないため、例外ではありません。 OutOfMemoryErrorはjava.lang.Errorを拡張します。あなたがキャッチしたい場合は、エラーはこれを試してみてください。

private void doSomeWork() 
{ 
    try 
    { 
     processData(); //Causes OutOfMemoryError 
     System.out.println("This line does not execute"); 
    } 
    catch (Error e) 
    { 
     System.out.println("Exception. This line does not execute."); 
     //Log error 
    } 
    finally 
    { 
     System.out.println("finally. This line does execute"); 
     System.out.println("Thread name: " + Thread.currentThread().getName()); 

    } 
} 

注意:あなたはまた、両方をキャッチするThrowableを使用できるように、例外やエラーはThrowableを拡張します。

http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Throwable.html

0

あなたから何も漏れは少なくとも問題をログに記録し、おそらくいくつかのクリーンアップを行う機会を持っている場合ので、私は通常、スレッドに「たuncaughtExceptionHandler」を追加しているんだろう何。

関連する問題