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)

第二次运行的输出:

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

第三次运行时输出:线程“main”中的 1Exception java.lang.Exception:src.dec.TST501.main(TST501.java:11) 处的第二个 2346

谁能解释一下它是怎么发生的?finally 块是否将在除 main 之外的任何其他线程中执行?

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

发生这种情况是因为您的两个 finally 块都将在执行的任何情况下执行,无论是否出现任何异常

于 2012-12-08T14:43:48.923 回答