【问题标题】:Why a stacktrace of an exception is printed at last?为什么最后会打印异常的堆栈跟踪?
【发布时间】:2021-09-06 15:29:20
【问题描述】:

这是我的简单测试代码:

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”代码必须最终执行,但事实并非如此。 是什么原因?

【问题讨论】:

  • 我认为 finally 只是定义为在catch 中的代码之前执行。不过为了确定,我必须在语言规范中查找。
  • @markspace:不,肯定是在catch块之后执行的。
  • 我接受更正!不过,我会留下我的评论,因为我认为这说明了一个可能的误解。
  • @markspace 我要说的是关键字finally 应该清楚地表明这是最后发生的事情;但后来我发现the Oracle tutorial says“finally 块总是在 try 块退出时执行。”,这是一个非常具有误导性的陈述。就像 JonSkeet 说的:如果 try 抛出了匹配的异常,它肯定会在 catch 之后执行。

标签: java exception stack-trace


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-04
    • 1970-01-01
    • 1970-01-01
    • 2011-01-18
    • 1970-01-01
    • 2010-09-18
    • 1970-01-01
    • 2018-06-07
    相关资源
    最近更新 更多