Java7后try-catch块的变化——aotocloseable接口

近几天在看java核心技术卷II,在1.6.6 迭代目录中文件一节中有如下代码:

try(DirectoryStream<Path> entries=Files.newDirectoryStream(dir))
{
	for(Path entry : entries)
		Process entres;
}

这里的try块代码与之前的用法不太一致,于是尝试写了一下测试代码诸如:

try(int i=0){
	…
}

发现会报一个错误

The resource type int does not implement java.lang.AutoCloseable

打开1.6的jdk文档却发现没有这个接口的说明,于是百度了一下这个接口发现是java7新增的功能:

 

(以下内容大部分摘自http://my.oschina.net/u/1995545/blog/359480)

在JDK7中只要实现了AutoCloseable或Closeable接口的类或接口,都可以使用try-with-resource来实现异常处理和资源关闭

异常抛出顺序。在Java se 7中的try-with-resource机制中异常的抛出顺序与Java se 7以前的版本有一点不一样。是先声明的资源后关闭

JDK7以前如果rd.readLine()与rd.close()(在finally块中)都抛出异常则只会抛出finally块中的异常,不会抛出rd.readLine();中的异常。这样经常会导致得到的异常信息不是调用程序想要得到的。

JDK7及以后版本中如果采用try-with-resource机制,如果在try-with-resource声明中抛出异常(可能是文件无法打或都文件无法关闭)同时rd.readLine();也势出异常,则只会势出rd.readLine()的异常。

总结:

1.java7新增了aotocloseable和closeable接口用于简化try-catch块及优化异常捕获机制

2.try(var){}写法中var必须实现了aotocloseable或closeable接口以完成原来finally块中代码的作用。

public class Main {
 //声明资源时要分析好资源关闭顺序,先声明的后关闭
 //在try-with-resource中也可以有catch与finally块。
 //只是catch与finally块是在处理完try-with-resource后才会执行。
 public static void main(String[] args) {
  try (Resource res = new Resource();
    ResourceOther resOther = new ResourceOther();) {
   res.doSome();
   resOther.doSome();
  } catch (Exception ex) {
   ex.printStackTrace();
  }
 }
 //JDK1.7以前的版本,释放资源的写法
 static String readFirstLingFromFile(String path) throws IOException {
  BufferedReader br = null;
  try {
   br = new BufferedReader(new FileReader(path));
   return br.readLine();
  } catch (IOException e) {
   e.printStackTrace();
  } finally {
   if (br != null)
    br.close();
  }
  return null;
 }
 //JDK1.7中的写法,利用AutoCloseable接口
 //代码更精练、完全
 static String readFirstLineFromFile(String path) throws IOException {
  try (BufferedReader br = new BufferedReader(new FileReader(path))) {
   return br.readLine();
  }
 }
}
class Resource implements AutoCloseable {
 void doSome() {
  System.out.println("do something");
 }
 @Override
 public void close() throws Exception {
  System.out.println("resource closed");
 }
}
class ResourceOther implements AutoCloseable {
 void doSome() {
  System.out.println("do something other");
 }
 @Override
 public void close() throws Exception {
  System.out.println("other resource closed");
 }
}

 


如果给你带来帮助,欢迎微信或支付宝扫一扫,赞一下。