2012-04-19 10 views
1

以下のコードで、あなたのフィードバックを必要とする - ここでのThrowableエラーをキャッチ

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"); 
    } 
} 

私はThrowableオブジェクトをキャッチするtry節&から(new演算子を使用して)のOutOfMemoryErrorオブジェクトを投げています。だから私はアウトプットを "throw catchable"にします& "最後に"。しかし、私たちはOutofMemErrorを投げているので、コードが終了してはいけません(つまり、最終的にThrowable &に行くことなく)?実際の実際のプロジェクトでは、OutOfMemoryErrorを取得すると、アプリケーションが終了します...なぜこの違いがありますか?

+0

これは、あなたが 'Throwable'を捕まえない理由です –

答えて

3

、(彼らはVMか何かをクラッシュしない限り)エラーがあまりにもキャッチすることができ、およびJava 6以降のOutOfMemoryErrorを引くことができます。

8

enter image description here

OutOfMemoryErrorThrowableクラスのサブクラスであるErrorクラスのサブクラスです。それはプリントアウトし、なぜ、これは次のとおりです。

インサイドはスロー可能

2

また何をするか例外か問題でエラーまたは例外である必要はありませんThrowableのサブクラス(またはキャッチエラー)Throwableをキャッチすることができます。

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

4

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

Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() { 

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

throw new OutOfMemoryError(); 
関連する問題