在Closable.close()中抛出运行时异常

kuk*_*kis 6 java exception ocpjp

在我学习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");
    }
}
}
Run Code Online (Sandbox Code Playgroud)

根据书中正确答案的问题"代码会抛出哪个例外?" 是"没有被抑制的异常的运行时异常c".我在Eclipse中检查了这段代码,system.out表明这本书是对的.但是,我还修改了一些代码并在抛出RuntimeException"c"之前添加了以下system.out

    System.out.println(e.getSuppressed().toString());
Run Code Online (Sandbox Code Playgroud)

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

[Ljava.lang.Throwable; @ 75da931b

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

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

Zor*_*art 3

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

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

因此,本书的答案是正确的,因为从该方法传播的唯一异常mainRuntimeException-C,没有cause( IOException),并且没有任何抑制的异常(因为它是 on IOException)。