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

Why a stacktrace of an exception is printed at last?

这是我的简单测试代码:

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");
        }
    }
}

在 运行 之后我会得到这个:

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

Process finished with exit code 0

我以为“finally”代码最后一定要执行,其实不是。 这是什么原因?

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

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