1

以下のコードに関するフィードバックが必要です -

public static void main(String[] args) {
try {
        throw new OutOfMemoryError();
    } catch (Exception e) {
        System.out.println("Inside catch");
    } catch (Throwable t){
        System.out.println("Inside catch throwable");
    }finally {
        System.out.println("Inside finally");
    }
}

ここでは、try 句から (new 演算子を使用して) OutOfMemoryError オブジェクトをスローし、Throwable オブジェクトをキャッチしています。そのため、「インサイド キャッチ スロー可能」と「インサイド ファイナル」という出力が得られます。しかし、OutofMemError をスローしているので、コードを終了するべきではありません (つまり、Throwable & finally に移動せずに) ? 実際の実用的なプロジェクトでは、OutOfMemoryError が発生した場合、アプリケーションは終了するだけです...なぜこの違いがあるのでしょうか?

4

4 に答える 4

8

ここに画像の説明を入力

OutOfMemoryErrorクラスのサブクラスであるクラスのErrorサブクラスThrowableです。これが出力される理由です:

インサイドキャッチ スローアブル

于 2012-04-19T17:52:16.363 に答える
4

いいえ、例外を飲み込んでいるため、コードは終了しません。あなたが説明した「従来のJavaプログラム」は、例外が処理されないため、この種のエラーでクラッシュします。プログラムのメインスレッドにデフォルトの例外ハンドラをインストールすることで、これを自分でテストできます。

Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() {

   @Override
   public void uncaughtException(Thread t, Throwable e) {
      e.printStackTrace(System.err);
   }
});

throw new OutOfMemoryError();
于 2012-04-19T17:55:13.847 に答える
3

一般に、エラーも (VM などをクラッシュさせない限り) キャッチすることができ、Java 6 以降では OutOfMemoryError をキャッチできます。

于 2012-04-19T17:55:59.233 に答える
2

Throwable をキャッチできる例外、エラー、または Throwable のサブクラス (例外またはエラーである必要はありません) は関係ありません。

スレッドが例外を終了する原因となることはありませんSystem.exit(0);。代わりにそれを試してください。

于 2012-04-19T17:53:57.440 に答える