为什么最后打印异常的堆栈跟踪?
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 的顺序。
这是我的简单测试代码:
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 的顺序。