如果在finally块内关闭了多个资源,是否需要进行异常处理?

时间:2016-02-24 15:47:57

标签: java exception-handling finally

一位同事因为最后的封锁而让我感到不安。他声称,如果在finally块中关闭了多个资源,我不必担心异常处理。

所以,如果我像这样关闭我的资源

try {
  // do stuff
} catch(Exception e) {
  // handle stuff
} finally {
  resource1.close();
  resource2.close();
}

并且在resource1.close()发生异常,是否会调用resource2的close()方法?

2 个答案:

答案 0 :(得分:1)

一个简单的检查将确认:

class MyResource implements AutoCloseable {
  private final String name;
  MyResource(String name) { this.name = name; }

  @Override public void close() throws IOException {
    System.out.println("Closing " + name);
    throw new IOException();
  }
}

public static void main(String[] args) throws IOException {
  MyResource a = new MyResource("a");
  MyResource b = new MyResource("b");
  try {
  } finally {
    a.close();
    b.close();
  }
}

这将打印"Closing a",然后打印堆栈跟踪;不会打印"Closing b"。相反:

  try (MyResource a = new MyResource("a");
       MyResource b = new MyResource("b")) {
  }

会同时打印。

答案 1 :(得分:0)

这取决于。如果在try-catch块中抛出的东西(显式或可能)是唯一的例外是关闭操作,那么你就不需要处理异常了。但是,大多数情况下,关闭操作本身被声明为抛出异常,因此,您无论如何都需要将它们放在try-catch块中。