为什么最后会打印异常的堆栈跟踪?

Мак*_*кин 2 java exception stack-trace

这是我的简单测试代码:

class Scratch {
    public static void main(String[] args) {
        try {
            System.out.println("Line 1");
            throw new RuntimeException();
        } catch (RuntimeException e) {
            e.printStackTrace();
        } finally {
            System.out.println("Line 2");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

运行后我会得到这个:

Line 1
Line 2
java.lang.RuntimeException
    at Scratch.main(scratch_4.java:5)

Process finished with exit code 0
Run Code Online (Sandbox Code Playgroud)

我以为“finally”代码必须最后执行,但事实并非如此。是什么原因?

Jon*_*eet 5

默认情况下,printStackTrace打印到System.err,而您正在写入System.out。因此,您正在写入两个不同的流,在您的特定情况下,看起来涉及的缓冲已将输出顺序与实际执行顺序切换。

如果您写入单个流(例如使用System.err.println 调用e.printStackTrace(System.out))或将catch块更改为像其他行一样写入System.out,您将看到 try => catch => finally 的顺序。