12

Java Webアプリケーションにjava.lang.OutOfMemoryError:Javaヒープスペース例外を引き起こすスレッドがありますが、try/catchブロックがエラーをキャッチしません。

サンプルコード:

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());

     }
}

出力:

ついに。この行は実行されます
スレッド名:_Worker-8
スレッド"_Worker-8"の例外java.lang.OutOfMemoryError:Javaヒープスペース
..。

バックグラウンド:

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

4

5 に答える 5

41

OutOfMemoryErrorは、ではErrorなく、Exceptionです。OutOfMemoryErrorはのサブクラスではないため、Exceptioncatch (Exception e)適用されません。

OutOfMemoryErrorただし、拡張するThrowableので、それをキャッチできるはずです。エラーをキャッチする必要がある場合(ある場合)についてのSOディスカッションを次に示します。一般的に、それについては何もできないので、本番コードでエラーをわざわざキャッチしないことをお勧めします。しかし、何が起こっているのかをデバッグしようとしている特別な場合を考えると、それは役立つかもしれません。

于 2009-12-11T14:58:21.393 に答える
12

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());

     }
}

注: Exception と Error は Throwable を拡張するため、Throwable を使用して両方をキャッチすることもできます。

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

于 2009-12-11T15:03:15.973 に答える
3

「~Error」は「~Exception」ではありません。

「エラー」または「スロー可能」をキャッチする必要があります

于 2009-12-11T14:58:22.877 に答える
2

OutOfMemoryError は VirtualMachineError を拡張し、Exception は Throwable を直接拡張します。そのため、Java 仕様に従ってキャッチされていません。すべての例外をキャッチする場合は、句に catch (Throwable e) を追加すると、それが得られます。

于 2009-12-11T15:00:22.810 に答える
0

私が通常行うことは、「UncaughtExceptionHandler」をスレッドに追加することです。そのため、何かが漏れた場合は、少なくとも問題をログに記録し、クリーンアップを行う機会があります。

于 2009-12-11T22:27:50.890 に答える