Java7后try-catch块的变化——aotocloseable接口
2015-07-16 16:15
239 查看
近几天在看java核心技术卷II,在1.6.6 迭代目录中文件一节中有如下代码:
这里的try块代码与之前的用法不太一致,于是尝试写了一下测试代码诸如:
发现会报一个错误
打开1.6的jdk文档却发现没有这个接口的说明,于是百度了一下这个接口发现是java7新增的功能:
(以下内容大部分摘自/article/2189657.html)
在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块中代码的作用。
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新增的功能:
(以下内容大部分摘自/article/2189657.html)
在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"); } }
相关文章推荐
- Java API中String类的用法 1
- Java高级个人笔记(可变参数的使用)
- windows下搭建eclipse远程开发hadoop应用环境
- 【JAVA】【NIO】5、Java NIO Scatter / Gather
- 创建一个SpringBoot + springmvc + hibernateJPA + MyBatis的项目
- Javassist学习总结
- java List 删除若干元素
- springmvc+easyui实现界面控制quartz的暂停、恢复、修改、添加
- eclipse template里面的${user}更改
- javassist学习一
- Spring -- 第一个简单的Spring程序
- javassist学习二
- java-银行业务调度系统《十一》
- Java 自动装箱与拆箱详解
- AVL树的插入与删除---Java实现
- Java高级个人笔记(java常用集合总结)
- Java反射机制:表单数据自动封装到JavaBean中【IT】
- JavaWeb的各种中文乱码解决方法
- eclipse项目导入androidstudio
- spring利用javamail,quartz…