【问题标题】:Throw runtime exception in Closable.close()在 Closable.close() 中抛出运行时异常
【发布时间】:2015-10-27 19:24:33
【问题描述】:

在我学习 OCPJP8 的过程中,我遇到了一个对我来说没有很明确答案的问题。考虑以下代码:

public class Animals
{
class Lamb implements Closeable
{
    public void close()
    {
        throw new RuntimeException("a");
    }
}

public static void main(String[] args)
{
    new Animals().run();
}

public void run()
{
    try (Lamb l = new Lamb();)
    {
        throw new IOException();
    }
    catch (Exception e)
    {
        throw new RuntimeException("c");
    }
}
}

根据书中正确答案“代码会抛出哪个异常?”是“没有抑制异常的运行时异常 c”。 我在 Eclipse 中检查了这段代码,system.out 表明这本书是正确的。但是,我也稍微修改了代码,并在抛出 RuntimeException "c" 之前添加了以下 system.out

    System.out.println(e.getSuppressed().toString());

我从这个 system.out 得到的输出是:

[Ljava.lang.Throwable;@75da931b

很明显有一个被抑制的异常。在调试模式下,我还发现这个被抑制的异常是 close() 方法中的一个皱眉。

两个问题: 1. 为什么控制台没有关于close()方法抛出异常的信息? 2. 书中给出的答案正确吗?

【问题讨论】:

  • 附带说明,使用System.out.println(Arrays.toString(e.getSuppressed())); 获得更有意义的输出...

标签: java exception ocpjp


【解决方案1】:

被抑制的异常 (RuntimeException-A) 被添加到在 catch 中捕获的 IOException 并从堆栈跟踪打印输出中丢失,因为它没有作为 causeRuntimeException-C 传递.

因此,当从main 打印RuntimeException-C 时,它没有提及IOException 或被抑制的RuntimeException-A。

因此本书的答案是正确的,因为从 main 方法传播的唯一异常是 RuntimeException-C 没有 cause (IOException),并且没有任何被抑制的异常(就像在 @ 987654334@).

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-21
    • 2015-06-03
    • 2019-08-20
    • 1970-01-01
    • 1970-01-01
    • 2013-10-28
    • 2011-10-21
    • 1970-01-01
    相关资源
    最近更新 更多