Java 在Closable.close()中引发运行时异常

Java 在Closable.close()中引发运行时异常,java,exception,ocpjp,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(); }

在我学习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

这个系统的输出是:

[Ljava.lang.Throwable;@75da931b

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

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

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

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


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

作为旁注,使用
System.out.println(Arrays.toString(例如getsupprested());
要获得更有意义的输出…
    System.out.println(e.getSuppressed().toString());