2015-10-17 15 views
15

try-catch-finally実行フローの仕組みを理解しようとしています。スタックオーバーフローのユーザーからの実行フローに関する2つのソリューションがあります。try-catch-finallyの実行順序はランダムであるようです。

その一例は以下のとおりです。

try { 
    // ... some code: A 
} 
catch(...) { 
    // ... exception code: B 
} 
finally { 
    // finally code: C 
} 

コードAが実行されようとしています。すべてがうまくいくと(すなわち、Aが実行されている間に例外がスローされない)、それはfinallyに行くので、コードCが実行されます。例外がスローされた場合はAが実行されている間、それはC.

に最終的にはそれからBに移動しますしかし、私は別の実行は、私はそれをしようとしたときに流れてしまった:

try { 
    int a=4; 
    int b=0; 
    int c=a/b; 
} 
catch (Exception ex) 
{ 
    ex.printStackTrace(); 
} 
finally { 
    System.out.println("common"); 
} 

を私は取得しています二つの異なる出力:

まず出力:

java.lang.ArithmeticException:/by zero 
at substrings.main(substrings.java:15) 
lication.AppMain.main(AppMain.java:140) 
common 

Howev

第二出力::私は二度目の同じプログラムを実行したときに、ER、

common 
    java.lang.ArithmeticException:/by zero 
    at substrings.main(substrings.java:15) 

私はこのことから何を締結する必要がありますか?それはランダムになる予定ですか?

+4

これまでの結果はどうでしたか、それはランダムではありません。クロスチェック。 –

+1

異なるシステムストリームが不適切な形式の出力を生成する –

+1

デバッガを接続してコードをステップ実行しようとしましたか? – iceman

答えて

42

printStackTrace()は標準エラー出力です。 System.out.println("common")は標準出力に出力します。どちらも同じコンソールにルーティングされますが、そのコンソールに表示される順序は必ずしも実行された順序ではありません。

catchブロックとfinallyブロック(たとえば、try System.err.println("common"))の両方で同じストリームに書き込むと、例外がキャッチされたときにcatchブロックがfinallyブロックの前に常に実行されることがわかります。

7

例外のprintstacktrace()方法ソースコードThrowableクラスで定義)

public void printStackTrace() { 
     printStackTrace(System.err); 
    } 

あなたがSystem.out.println介して標準出力ストリームを使用しているので、出力のフォーマットが発生し、例外が有する試しSystem.errストリーム

を発生例外をチェックし、例外が発生した場合に同じエラーコンソールで出力する変数: -

boolean isException = false; 
try { 
     int a=4; 
     int b=0; 
     int c=a/b; 
    } 
    catch (Exception ex) 
    { 
     isException = true 
     ex.printStackTrace(); 
    } 
    finally { 
     if(isException){ 
     System.err.println("common"); 
     }else{ 
     System.out.println("common"); 
     } 
    } 
関連する問題