没有给出catch块时,正确的语句顺序应该是什么?

时间:2015-03-14 11:02:00

标签: java exception-handling

我有以下代码段: -

public class MyProgram { 
    public static void throwit(){  
        throw new RuntimeException();
    }

    public static void main(String args[]){
        try {
            System.out.println("Hello world ");
            throwit();
            System.out.println("Done with try block ");
        }
        finally {
            System.out.println("Finally executing ");
        }
    }
}

据我所知, 一旦程序抛出未捕获的RuntimeException(在throwit()方法中),将执行finally块并终止程序。如果方法不处理异常,则在传播异常之前执行finally块。

但是,我得到的输出每次都有不同的顺序 我得到的ouptuts:

输出1: -

        Hello world 
        Finally executing 
        Exception in thread "main" java.lang.RuntimeException 
            at tutorialspoint.A.throwit(A.java:6) 
            at tutorialspoint.A.main(A.java:13) 

输出2: -

        Hello world 
        Exception in thread "main" java.lang.RuntimeException 
            at tutorialspoint.A.throwit(A.java:6) 
            at tutorialspoint.A.main(A.java:13) 
        Finally executing 

2 个答案:

答案 0 :(得分:3)

您的理解是正确的。首先执行finally块,然后传播异常。

第二个输出可能是因为程序的输出被写入System.out并且execption的详细信息被写入System.err。由于两个流都被重定向到同一个窗口,因此它们的打印顺序可能会在不同的执行中发生变化。

如果您将System.setErr(System.out);行添加到main方法的开头,则所有输出(包括错误)都会写入System.out,您将始终看到按照OUTPUT 1中的顺序排列。

答案 1 :(得分:0)

你是对的。

输出可能是由于System.out中的竞赛条件输出到标准控制台而System.err输出到错误控制台。