资源自动释放是JDK7的一个重大改进。 jdk7提供了try-with-resources,可以自动关闭相关的资源(只要该资源实现了AutoCloseable接口,jdk7为绝大部分资源对象都实现了这个接口)。
try
-with-resources 语句是一个声明了1到多个资源的try语句。资源是指这个try执行完成后必需close掉的对象,比如connection, resultset等。
try
-with-resources 语句会确保在try语句结束时关闭所有资源。实现了java.lang.AutoCloseable
或java.io.Closeable
的对象都可以做为资源。
下面是一个例子,它会从一个文件中读出首行文本,这里使用了
BufferedReader
的实例来读取数据,BufferedReader
是一个资源,它应该在程序完成时被关闭。static String readFirstLineFromFile(String path) throws IOException { try (BufferedReader br = new BufferedReader(new FileReader(path))) { return br.readLine(); } }
可以看到,由于
被定义在BufferedReader
try
-with-resource 语句中,因此不管try代码块是正常完成或是出现异常,这个BufferedReader
的实例都将被关闭。
而在java7之前的版本中,需要使用finally 代码块来确保资源被关闭(不管try正常完成还是出现异常)。
static String readFirstLineFromFileWithFinallyBlock(String path) throws IOException { BufferedReader br = new BufferedReader(new FileReader(path)); try { return br.readLine(); } finally { if (br != null) br.close(); } }
以上是JDK7自动关闭的一个总结,实例都是使用的其他人文章里的。看到这些问题,让我心里一动,提出一个我的问题是,自动释放机制能否区分是正常释放还是异常释放?具体的说,就是这个释放,是try块正常完成了还是出现异常了需要释放?
之所以提出这个问题,就是因为资源释放是代码非常容易出现bug的场景,而异常情况下是否能合理清理资源、释放资源又是其中最最容易出错的地方。
从数据库相关开发的角度看,例如下面的代码:
Connection connection = null; Statement statement = null; try{ connection = pool.getConnection(); statement = connection.createStatemnet(); boolean executionStatus= statement.execute(“query”); }catch(Exception e){ //Block of code for handle the exception e.printStacktrace(); }finally{ try{ statement.close(); connection.close(); }catch(Exception e){ //block of statements for handle exceptions. }
在JDK7中简化成
Connection connection = null; Statement statement = null; try(//请注意这里的小括号,不是大括号 connection = pool.getConnection(); statement = connection.createStatemnet() ) { boolean executionStatus= statement.execute(“query”); }catch(Exception e){ //block of statements for handles the exceptions }
在上面的情况下,如果需要事务控制,变成:
Connection connection = null; Statement statement = null; try(//请注意这里的小括号,不是大括号 connection = pool.getConnection(); statement = connection.createStatemnet() ) { boolean executionStatus= statement.execute(“query”); conn.commit(); }catch(Exception e){ //block of statements for handles the exceptions conn.rollback(); }
正常执行,到最后,需要提交事务;异常关闭,需要先回滚,然后再关闭。这个事务的控制还得要自己写代码才行。
所以对Oracle提供的java.lang.AutoCloseable接口有一些疑问,为什么只是提供了一个这样的接口供实现:
void close()
为什么不是:
normalClose();//正常关闭 errorClose();//异常关闭
如果是接口这样设计和实现,那么开发可以变得非常简单了。
我举的数据库连接只是一个示例(事务是一个,再有一个是如果出现异常,那么连接很有可能就不能回池了,只能销毁,因为是坏了的连接)。还有很多类似场景,正常关闭和错误关闭都需要外边很多其他额外工作,不简单的是close那么一件事。
如果有这样的接口,那么,在开发过程中,在基础类实现中,前期把这些资源的释放(创建还好说,释放至关紧要)都设计实现好,把AutoCloseable需要的两个接口(可惜现在Java只有一个)实现好,那么就会很大程度上减少后期团队开发过程中出现错误。
相关推荐
JDK7安装包.zip\JDK7安装包.zip\JDK7安装包.zip\JDK7安装包.zip\JDK7安装包.zip JDK7安装包.zip\JDK7安装包.zip\JDK7安装包.zip\JDK7安装包.zip\JDK7安装包.zip JDK7安装包.zip\JDK7安装包.zip\JDK7安装包.zip\JDK7...
JDK7,即Java SE 7(标准版7),2011年推出,引入了显著的语法改进,例如try-with-resources语句,用于自动关闭资源,增强了switch语句,允许使用字符串作为case标签,以及对多路复用文件I/O的支持。此外,JDK7还...
标签"mac java jdk7"强调了这个资源与Mac操作系统、Java编程语言以及JDK7版本的关系。文件名"jdk-7u80-macosx-x64.dmg"揭示了这是一个适用于Mac OS X 64位系统的JDK7更新80的.dmg安装文件。DMG是苹果电脑上的镜像...
而在JDK7中,实现了自动关闭资源的机制,只要资源实现了`java.lang.AutoCloseable`接口,就可以在try块中直接声明并使用,程序结束时会自动调用`close()`方法。 其次,多线程处理方面,JDK7引入了Fork/Join框架,它...
**JDK7免安装解压包详解** Java Development Kit(JDK)是Oracle公司提供的用于开发和运行Java应用程序的工具集。...对于那些需要频繁更换开发环境或者对系统资源有限制的场合,这种绿色版JDK7尤为适用。
在给定的资源中,我们关注的是JDK 7的Linux版本,特别是针对64位操作系统。JDK 7,也被称为Java 7,是Java平台的一个重要版本,发布于2011年。它引入了一系列新特性,提升了开发者的效率,并且对性能进行了优化。 #...
jdk7 jdk8 jdk9 jdk10 jdk11 jdk12 jdk13 jdk14 (win-64位) 资源共享
JDK7是Oracle公司发布的第七个主要版本,它在JDK6的基础上增加了一些新特性,改进了性能,并修复了许多已知问题。Windows 32位版本的JDK7是专门为在32位操作系统环境下运行而设计的,确保了在这样的平台上开发和运行...
这个PDF学习笔记是开发者深入理解JDK 7特性和功能的重要参考资料。以下是对Java JDK 7的一些核心知识点的详细阐述: 1. **泛型改进**:在JDK 7中,泛型的使用更加灵活,引入了类型推断(Type Inference)特性,通过...
### JDK 7 (Java Development Kit 7) 版本介绍 #### 一、JDK 7 概述 JDK 7(Java Development Kit 7)是Java平台的一个重要版本,由Oracle公司发布。它是Java SE 7标准的实现,为开发者提供了用于编写Java应用程序...
1. **多语言支持**:JDK7引入了`try-with-resources`语句,使得资源管理更加简洁高效。开发者可以自动关闭在try块中打开的任何实现了`AutoCloseable`接口的对象,避免了手动关闭资源可能导致的资源泄露。 2. **钻石...
《深入解析JDK7在Aarch64架构下的应用与实践》 在当前的IT行业中,随着国产化软硬件的快速发展,对支持多种架构的软件需求日益增长。JDK7-aarch64-uos.tar.gz这个压缩包文件,便是针对arm64与aarch64架构的Linux...
《深入解析JDK7源码》 JDK7(Java Development Kit 7)是Java编程语言的一个重要版本,它的发布带来了许多新特性和改进,极大地提升了开发者的工作效率和代码质量。对于Java开发者而言,理解JDK源码是提升编程技能...
1. **多线程与并发优化**:JDK7加强了对多线程和并发的支持,引入了Fork/Join框架,这是一个并行计算的模型,可以将大型任务拆分为可独立执行的小任务,然后合并结果,有效利用多核处理器的优势。 2. **类型推断**...
1. **自动资源管理(try-with-resources)**:JDK7引入了try-with-resources语句,使得在使用完一个实现了`AutoCloseable`接口的对象后,可以自动关闭,避免资源泄露,提高了代码的可读性和安全性。 2. **多 catch ...
Java 7,也被称为JDK 7或Java SE 7 (Java Standard Edition 7),是在2011年发布的,引入了多项重要的新特性和改进。以下是其中的关键亮点: 1. **多语言支持**:Java 7增加了对其他编程语言的支持,如Groovy、Scala...
《深入解析JDK7 64位安装版》 JDK,全称Java Development Kit,是Java编程语言的必备工具集,为开发者提供了编写、编译、调试以及运行Java应用程序所需要的一切。JDK7是Oracle公司推出的一个重要版本,针对64位操作...
jdk7 jdk8 jdk9 jdk10 jdk11 jdk12 jdk13 jdk14 (linux-rpm 64位) 资源共享
首先,JDK7是Java平台的一个重大更新,正式版本为7u40,它引入了多项新特性,如Try-with-resources语句,用于自动管理资源关闭,避免资源泄露;多 catches 语句,允许在一个catch块中捕获多种类型的异常;钻石操作符...
将JDK 7与Tomcat 8.0结合使用,开发者可以构建、测试和部署基于Java EE 7的应用程序。这个压缩包可能包含JDK 7的安装文件、Tomcat 8.0的服务器二进制文件,以及可能的教学材料、示例代码或配置文件,以帮助初学者或...