0
public class Test {
    public static void main(String args[]) throws Exception{
        try{        
            System.out.print("1");
            throw new Exception("first");
        }   
        catch (Exception e) {
            System.out.print("2");
            throw new Exception("second");      
        }
        **finally**{
            System.out.print("3");
            try{
                System.out.print("4");              
            }catch (Exception e) {
                System.out.print("5");
                throw new Exception("third");
            }
            finally{
                System.out.print("6 ");             
            }
        }
    }   
}

最初の実行時の出力:

12Exception in thread "main" 346 java.lang.Exception: second
    at src.dec.TST501.main(TST501.java:11)

2 回目の実行時の出力:

12346 Exception in thread "main" java.lang.Exception: second
    at src.dec.TST501.main(TST501.java:11)

3 回目の実行時の出力: 1Exception in thread "main" java.lang.Exception: second 2346 at src.dec.TST501.main(TST501.java:11)

誰がそれがどのように起こっているのか説明できますか? finally ブロックはメイン以外のスレッドで実行されますか?

4

3 に答える 3

9

finallyブロックは同じスレッドで実行されます。出力がこのようにインターリーブされる理由は、標準出力と標準エラー出力データの方法に関係しています。

標準出力はバッファーに入れられますが (標準エラーはそうではありません)、出力がどのようにインターリーブされるかは、システムがいつ出力バッファーをフラッシュするかによって異なります。(端末エミュレーターはこれらのストリームを両方とも一緒に表示するだけなので、観察した混合出力が得られます。)

于 2012-12-08T14:45:39.270 に答える
1

System.errが よりも遅いためSystem.outです。System.err に変更すると、常に表示されます 12346 Exception in thread "main" java.lang.Exception: second at Test.main(Test.java:8)

于 2013-04-08T08:16:16.617 に答える
-2

これは、例外が発生するかどうかにかかわらず、実行のあらゆる状況で両方の最終ブロックが実行されるために発生しています。

于 2012-12-08T14:43:48.923 に答える