【问题标题】:try with Resources尝试资源
【发布时间】:2017-01-03 00:40:41
【问题描述】:

我在“尝试资源”主题中遇到了一个疑问。

程序代码:

public class Suppressed_Exception_Eg03 
{ 
    public static void main(String[] args)
    { 
        try (Wolf obj = new Wolf(); Deer obj1 = new Deer();)
        { 
            //Both close statements are executed . 
            //Therefore , we see two closing stmts 
        } 
        catch(Exception e) 
        { 
            System.out.println(e.getMessage()); 
        } 
} 

static class Wolf implements AutoCloseable 
{ 
    @Override 
    public void close() throws Exception 
    { 
        System.out.println("Closing Wolf !"); 
        throw new RuntimeException("In Wolf !"); 
    } 
} 

static class Deer implements AutoCloseable 
{ 
    @Override 
    public void close() throws Exception 
    { 
        System.out.println("Closing Deer !"); 
        throw new RuntimeException("In Deer !"); 
    } 
} 

输出:

Closing Deer ! 
Closing Wolf ! 
In Deer ! 

疑问:我们都知道 Deer 类的 close 方法将首先关闭,然后是 Wolf 类。因此,Wolf 类抛出的异常应该抑制 Deer 类抛出的异常。 所以,我们应该在 catch 块中捕获 Wolf 类的异常。但是在这里我们可以在输出中看到,捕获并打印了 Deer 类的异常。有人可以解释为什么会这样吗?

【问题讨论】:

  • 请通过将每个块缩进四个空格来格式化您的代码,确保同一块或同一块级别上的每一行的缩进量与其他行完全相同。是的,这是一个挑剔的要求,但同样,我们是志愿者,您希望努力让其他人更容易帮助您。
  • 运行时异常将您从 try 块中引导出来。如果这是我的代码和问题,我会检查字节码。
  • .... 你还没有格式化你的代码。为什么?
  • 我不明白如何格式化我的帖子。对我来说它看起来很好。

标签: java try-with-resources


【解决方案1】:

规范说:

资源以与初始化相反的顺序关闭。 仅当资源初始化为非空值时才关闭资源。关闭一个资源的异常不会阻止关闭其他资源。如果之前由初始化程序、try 块或资源关闭引发了异常,则此类异常将被抑制。

代码中的第一个异常 (Deer) 不会被抑制,因为之前没有抛出异常。然后,关闭下一个资源(Wolf),但这一次来自Wolf 的异常被抑制。

【讨论】:

  • 嗨大卫,我不知道“关闭一个资源的异常不会阻止关闭其他资源。”和“如果初始化程序先前抛出异常,则会抑制异常、try 块或资源的关闭”。如果是这种情况,那么输出是合理的。谢谢大卫!
猜你喜欢
  • 1970-01-01
  • 2018-08-30
  • 1970-01-01
  • 1970-01-01
  • 2012-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多