JDK1.7中新增自动释放资源接口AutoCloseable

简介:

新增了try-with-resource 异常声明

在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()的异常。

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");
 }
}
目录
相关文章
|
3月前
|
编译器 C# 开发者
C# 11.0中的新特性:覆盖默认接口方法
C# 11.0进一步增强了接口的灵活性,引入了覆盖默认接口方法的能力。这一新特性允许类在实现接口时,不仅可以提供接口中未实现的方法的具体实现,还可以覆盖接口中定义的默认方法实现。本文将详细介绍C# 11.0中接口默认方法覆盖的工作原理、使用场景及其对现有代码的影响,帮助开发者更好地理解和应用这一新功能。
|
2月前
|
前端开发 算法 JavaScript
检查是否是类的对象实例
检查是否是类的对象实例
16 0
|
6月前
通过普通方式调用和反射方式调用以及关闭检测后,通过反射方式调用的性能对比
通过普通方式调用和反射方式调用以及关闭检测后,通过反射方式调用的性能对比
|
7月前
|
Java 编译器
JDK21更新内容:匿名类和实例主方法
JDK21更新内容:匿名类和实例主方法
|
9月前
|
设计模式 存储 Java
Java版事件与委托实现自动创建工厂并热加载
Java版事件与委托实现自动创建工厂并热加载
Java版事件与委托实现自动创建工厂并热加载
|
设计模式 Java
【JVM】Java对象创建的流程步骤
【JVM】Java对象创建的流程步骤
159 0
|
Java 关系型数据库 MySQL
抽象类与接口的比较?构造方法,构造方法重载,什么是复制构造方法?求N的阶乘?Java环境搭建:JDK、JRE、JVM关系?MySQL事务并发三大问题,针对事务并发的问题、java接口详情
抽象类与接口的比较?构造方法,构造方法重载,什么是复制构造方法?求N的阶乘?Java环境搭建:JDK、JRE、JVM关系? 抽象类与接口的比较
119 1
|
缓存
读源码长知识 | 动态扩展类并绑定生命周期的新方式
在阅读viewModelScope源码时,发现了一种新的方式。 协程需隶属于某 CoroutineScope ,以实现structured-concurrency,而 CoroutineScope 应
136 0
|
Java
Java中File类概述和构造方法、创建功能、判断和获取功能及删除功能
File类概述和构造方法、创建功能、判断和获取功能及删除功能的简单示例
104 0
Java中File类概述和构造方法、创建功能、判断和获取功能及删除功能
|
缓存 Java
JDK1.8 创建线程池有哪几种方式?
JDK1.8 创建线程池有哪几种方式?
151 0