在Closable.close()

时间:2015-10-27 19:24:33

标签: 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");
    }
}
}

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

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

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

  

[Ljava.lang.Throwable; @ 75da931b

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

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

1 个答案:

答案 0 :(得分:3)

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

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

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