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

标签 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 "c"之前添加了以下 system.out

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

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

[Ljava.lang.Throwable;@75da931b

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

两个问题: 1、为什么console中没有close()方法抛出异常的信息? 2.书上给出的答案是否正确?

最佳答案

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

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

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

关于java - 在 Closable.close() 中抛出运行时异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33376813/

相关文章:

java - Oracle Java 7 认证 : The private and protected access modifiers can be used with which entities?

java - 甲骨文认证(OCA JP-1z0 803 和 OCPJP-1z0 804)

java - GraphViz 的纯 Java 重新实现?

java - 生成Google搜索引擎的XPath表达式

c# - EWS 流订阅 System.Xml.XmlException

java - 在不丢失堆栈跟踪的情况下重新抛出 Java 中的异常

java - 为什么我不能添加两个字节并获得一个 int,而我可以添加两个最终字节获得一个字节?

java - Spring @RestController 调用大量请求

java - 如何重置循环计数器?

c++ - 抛出临时值作为引用未定义的行为吗?