Java 在Closable.close()中引发运行时异常
在我学习OCPJP8的过程中,我遇到了一个问题,这个问题没有很清楚的答案。考虑下面的代码: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(); }
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());