当程序使用 finally 块关闭资源时,程序会显得异常臃肿,例如以下代码。

public static void main(String[] args) {FileInputStream fis = null;try {fis = new FileInputStream("a.txt");} catch (FileNotFoundException e) {e.printStackTrace();} finally {// 关闭磁盘文件,回收资源if (fis != null) {try {fis.close();} catch (IOException e) {e.printStackTrace();}}}
}

Java 7 以前,上面程序中的 finally 代码块是不得不写的“臃肿代码”,为了解决这种问题,Java 7 增加了一个新特性,该特性提供了另外一种管理资源的方式,这种方式能自动关闭文件,被称为自动资源管理(Automatic Resource Management)。该特性是在 try 语句上的扩展,主要释放不再需要的文件或其他资源。

自动资源管理替代了 finally 代码块,并优化了代码结构和提高程序可读性。语法如下:

try (声明或初始化资源语句) {// 可能会生成异常语句
} catch(Throwable e1){// 处理异常e1
} catch(Throwable e2){// 处理异常e1
} catch(Throwable eN){// 处理异常eN
}

当 try 代码块结束时,自动释放资源。不再需要显式的调用 close() 方法,该形式也称为“带资源的 try 语句”。

注意:

  1. try 语句中声明的资源被隐式声明为 final,资源的作用局限于带资源的 try 语句。
  2. 可以在一条 try 语句中声明或初始化多个资源,每个资源以;隔开即可。
  3. 需要关闭的资源必须实现了 AutoCloseable 或 Closeable 接口。

Closeable 是 AutoCloseable 的子接口,Closeable 接口里的 close() 方法声明抛出了
IOException,因此它的实现类在实现 close() 方法时只能声明抛出 IOException
或其子类;AutoCloseable 接口里的 close() 方法声明抛出了 Exception,因此它的实现类在实现 close()
方法时可以声明抛出任何异常。

下面示范如何使用自动关闭资源的 try 语句。

public class AutoCloseTest {public static void main(String[] args) throws IOException {try (// 声明、初始化两个可关闭的资源// try语句会自动关闭这两个资源BufferedReader br = new BufferedReader(new FileReader("AutoCloseTest.java"));PrintStream ps = new PrintStream(new FileOutputStream("a.txt"))) {// 使用两个资源System.out.println(br.readLine());ps.println("阿巴阿巴阿巴");}}
}

上面程序中粗体字代码分别声明、初始化了两个 IO 流,BufferedReader 和 PrintStream 都实现了 Closeable 接口,并在 try 语句中进行了声明和初始化,所以 try 语句会自动关闭它们。

自动关闭资源的 try 语句相当于包含了隐式的 finally 块(这个 finally 块用于关闭资源),因此这个 try 语句可以既没有 catch 块,也没有 finally 块。

Java 7 几乎把所有的“资源类”(包括文件 IO 的各种类、JDBC 编程的 Connection 和 Statement
等接口)进行了改写,改写后的资源类都实现了 AutoCloseable 或 Closeable 接口。

如果程序需要,自动关闭资源的 try 语句后也可以带多个 catch 块和一个 finally 块。

Java 9 再次增强了这种 try 语句。Java 9 不要求在 try 后的圆括号内声明并创建资源,只需要自动关闭的资源有 final 修饰或者是有效的 final (effectively final),Java 9 允许将资源变量放在 try 后的圆括号内。上面程序在 Java 9 中可改写为如下形式。

public class AutoCloseTest {public static void main(String[] args) throws IOException {// 有final修饰的资源final BufferedReader br = new BufferedReader(new FileReader("AutoCloseTest.java"));// 没有显式使用final修饰,但只要不对该变量重新赋值,该变量就是有效的final PrintStream ps = new PrintStream(new FileOutputStream("a. txt"));// 只要将两个资源放在try后的圆括号内即可try (br; ps) {// 使用两个资源System.out.println(br.readLine());ps.println("阿巴阿巴阿巴");}}
}

1.9 Java 9增强的自动资源管理相关推荐

  1. java自动gc_具有Java 7中自动资源管理功能的GC

    java自动gc 这篇文章简要概述了Java 7中引入的称为自动资源管理或ARM的新功能. 文章探讨了ARM如何减少开发人员为有效释放分配的资源的JVM堆而必须编写的代码. Java编程语言中编程的最 ...

  2. 具有Java 7中自动资源管理功能的GC

    这篇文章简要概述了Java 7中引入的称为自动资源管理或ARM的新功能. 文章探讨了ARM如何减少开发人员为有效释放分配的资源的JVM堆而必须编写的代码. Java编程语言中编程的最甜蜜之处之一是对象 ...

  3. 深入探索JVM自动资源管理

    \ 本文要点 \ 了解C++ RAII模式和Java收尾机制(Finalization)间的差异. \ 深入Hotspot的源代码,厘清Finalizer的注册机制. \ 对比finalize()方法 ...

  4. java毕业生设计药品自动贩卖系统计算机源码+系统+mysql+调试部署+lw

    java毕业生设计药品自动贩卖系统计算机源码+系统+mysql+调试部署+lw java毕业生设计药品自动贩卖系统计算机源码+系统+mysql+调试部署+lw 本源码技术栈: 项目架构:B/S架构 开 ...

  5. 用java实现一个简易自动提款机

    用java实现一个简易自动提款机,且有以下要求 如何实现呢?首先,我们定义一个用户类User,同时根据要求设计好属性(本人部分命名没有使用驼峰命名法,不够规范).因为一个人可能有多个卡,卡号又不能重复 ...

  6. java培训教程分享:Java编写软件代码自动提示功能

    本期的java培训教程分享主要是介绍的java编写软件代码的一个自动提示功能,很多零基础和初学java的同学们对这一块还不是很了解,Eclipse for android 实现代码自动提示智能提示功能 ...

  7. 使用Java让android手机自动执行重复重启

    使用Java让android手机自动执行重复重启 public static void main(String[] args)throws IOException,Exception { for(in ...

  8. Java版 QQ空间自动登录无需拷贝cookie一天抓取30WQQ说说数据流程分析【转】

    Java版 QQ空间自动登录无需拷贝cookie一天抓取30WQQ说说数据&流程分析 QQ空间说说抓取难度比较大,花了一个星期才研究清楚! 代码请移步到GitHub GitHub地址:http ...

  9. Eclipse输入Java和XML代码自动提示功能最简单的方法

    Eclipse输入Java和XML代码自动提示功能 1.设置 java 文件的代码提示功能 打 开 Eclipse 依次选择 Window > Preferences > Java > ...

最新文章

  1. 20. matlab 中的gtext 函数
  2. jenkins 邮件配置 二 ***
  3. Titanium开发环境搭建第一个坑
  4. 当前主流、最新技术回眸(四)
  5. html图片在ie中有边框,html – 表格的边框在IE中不起作用
  6. 使用Javascript来实现的超炫组织结构图(Organization Chart)
  7. TensorFlow1.0正式发布,AI圈“互怼”那些事儿 | AI科技评论周刊
  8. esp8266舵机驱动_arduino开发ESP8266学习笔记四—–舵机
  9. atitit uke产品线 attilax总结.docx 1. 知识聚合 知识检索 产品线 1 2. 爬虫产品线 1 3. 发帖机产品线 1 4. 发动机产品线 1 5. O2o产品线(旅游
  10. 雷达原理---时频分析--2.短时傅里叶变换
  11. 如何管理时间:重要紧急四象限的思考
  12. Linux常用图片查看处理软件
  13. 离职时,是在公司群里大方告别,主动退群?还是一言不发,默默退出?
  14. 懒羊羊的作业:看过国产动画片的同学都知道,懒羊羊是一只非常懒的羊,整天除了吃就是睡,根本没有时间做作业。明天就是周一了,村长慢羊羊留的作业:把 n 个整数从大到小排序,它还没开始写...
  15. 深造分布式 打败面试官 招式二 新手上路
  16. REBUILD INDEX
  17. webView.addJavascriptInterface 用法
  18. 【三角形判断】测试用例设计
  19. EndNote插入文献闪退
  20. JVM 2eden survivor分配问题)

热门文章

  1. BlockChain:区块链/加密数字货币落地技术应用高质量相关文章
  2. 跳出小程序 video组件 卡顿、黑屏、全屏等坑
  3. CSAPP:第三章程序的机器级表示1
  4. 201312-1- 出现次数最多的数
  5. set nocount on
  6. 生产环境提升rman备份速度----启动块跟踪
  7. linux ifconfig 命令详解
  8. 有关表格边框的css样式表语法说明
  9. stm32f103 spi crc
  10. 语义分析的一些方法(中篇)