在我学习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之前添加了以下system.out“c”
System.out.println(e.getSuppressed().toString());
我从这个system.out获得的输出是:
[Ljava.lang.Throwable; @ 75da931b
很明显有一个被抑制的异常。在调试模式下,我还发现这个被抑制的异常是close()方法中的一个。
两个问题: 1.为什么控制台中没有关于close()方法抛出异常的信息? 2.本书给出的答案是否正确?
答案 0 :(得分:3)
被抑制的异常(RuntimeException
- A)被添加到IOException
中捕获的catch
并从堆栈跟踪打印输出中丢失,因为它未作为{{1}传递} cause
- C.
因此,当从RuntimeException
打印RuntimeException
- C时,它没有提及main
或被忽略的IOException
- A。
因此本书的答案是正确的,因为从RuntimeException
方法传播的唯一例外是main
- C没有RuntimeException
(cause
) ,没有任何被抑制的异常(就像在IOException
上一样)。