try-with-resources优先于try-finally
参考资料:《Effective Java》、《Java核心技术 卷1》、https://www.cnblogs.com/flyingeagle/articles/10152925.html
基础回顾
1.finally子句
当代码抛出异常时,就会终止方法中剩余代码的处理,如果这个方法获取了一些本地资源,就必须要回收这些资源。
这时候可能就需要用到finally子句了。下列三种情况会执行finally子句:
1.代码没有抛出异常,程序优先执行完try语句中全部的代码,然后再执行finally子句中的代码。
2.当catch中捕获了异常,首先执行try语句中的代码,直到出现异常为止,然后跳过try语句中剩下的代码,去对应的catch中,最后执行finally语句中的代码。
3.代码抛出异常,但是不是由catch捕获,这种情况会首先执行try语句中的代码,直到出现异常为止,然后跳过try语句中剩下的代码去执行finally子句的语句。
注:try语句可以只有finally没有catch,也可以只有catch没有finally。
try-with-resources
普通的try-catch-finally语法如下:
try{
//业务代码
}catch (Exception ex){
//异常
}finally {
//最后执行的代码
}
try-with-resources语法:
try (Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/how2java?characterEncoding=UTF-8", "root", "admin");
Statement statement = connection.createStatement();) {//连接数据库
//小括号声明需要的资源
//业务代码
} catch (SQLException e) {
e.printStackTrace();//try-with-resources也可以使用catch和finally子句,功能一样
}
与普通的try-catch-finally语句相比,主要区别是:
1.try后面加上小括号,在小括号里完成资源的初始化,同一个小括号里可以声明多个资源。
2.try块退出时,会自动调用close方法,这样就不用在finally里面显式的去关闭资源。
为什么要优先使用try-with-resources呢?主要原因如下:
如果只是一层,try-catch-finally并不会显得多么复杂。但是如果在try里面或者finally里面嵌套了其他更多的try-catch-finally,然后都需要显式的去关闭资源,会显得代码非常冗余。
值得注意的是,实现AutoCloseable接口是使用try-with-resources语句的前提
try-with-resources优先于try-finally的更多相关文章
- 条目二十六《iterator优先于const_iterator、reverse_iterator以及const_reverse_iterator》
条目二十六<iterator优先于const_iterator.reverse_iterator以及const_reverse_iterator> 这几个东西不是类型来的,而是不同的类,所 ...
- Android 输入法截取key优先于view
为了验证编写了个例子 首先是输入法 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 public class RemoteKeyboard exte ...
- Effective Java —— try-with-resources 优先于 try-finally
本文参考 本篇文章参考自<Effective Java>第三版第九条"Prefer try-with-resources to try-finally" The cod ...
- Java系列笔记(4) - JVM监控与调优
目录 参数设置收集器搭配启动内存分配监控工具和方法调优方法调优实例 光说不练假把式,学习Java GC机制的目的是为了实用,也就是为了在JVM出现问题时分析原因并解决之.通过学习,我觉得JVM ...
- JVM监控与调优
目录 参数设置收集器搭配启动内存分配监控工具和方法调优方法调优实例 转:http://www.cnblogs.com/zhguang/p/java-jvm-gc.html光说不练假把式,学习J ...
- [java] JVM监控与调优
原文出处:http://www.cnblogs.com/zhguang/p/java-jvm-gc.html 光说不练假把式,学习Java GC机制的目的是为了实用,也就是为了在JVM出现问题时分 ...
- 如何调优JVM - 优化Java虚拟机(大全+实例)
堆设置 -Xmx3550m:设置JVM最大堆内存 为3550M. -Xms3550m:设置JVM初始堆内存 为3550M.此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存. -X ...
- Tomcat性能调优-JVM监控与调优
参数设置 在Java虚拟机的参数中,有3种表示方法用"ps -ef |grep "java"命令,可以得到当前Java进程的所有启动参数和配置参数: 标准参数(-),所有 ...
- 如何调优JVM
堆设置 -Xmx3550m:设置JVM最大堆内存 为3550M. -Xms3550m:设置JVM初始堆内存 为3550M.此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存. -X ...
随机推荐
- SpringBoot中神奇的@Enable*注解?
在SpringBoot开发过程,我们经常会遇到@Enable开始的好多注解,比如@EnableEurekaServer.@EnableAsync.@EnableScheduling等,今天我们就来分析 ...
- docker-compose 的使用
1.安装docker-compose,参考官方教程:https://docs.docker.com/compose/install/ [chenjl@ipha-dev71- ~]$ sudo curl ...
- Java Web项目中使用Freemarker生成Word文档遇到的问题
这段时间项目中使用了freemarker生成word文档.在项目中遇到了几个问题,在这里记录一下.首先就是关于遍历遇到的坑.整行整行的遍历是很简单的,只需要在整行的<w:tr></w ...
- 张高兴的 .NET Core IoT 入门指南:(五)PWM 信号输出
什么是 PWM 在解释 PWM 之前首先来了解一下电路中信号的概念,其中包括模拟信号和数字信号.模拟信号是一种连续的信号,与连续函数类似,在图形上表现为一条不间断的连续曲线.数字信号为只能取有限个数值 ...
- vue 踩坑--项目名称不能与插件名称一样
今天webpack搭建,命令行一直报错 百度说是项目名称为:vue npm 拒绝安装 后来才发现是 package.json的name名称也设成了vue 所以 修改一下就可以了.
- Swift UIViewController中的delegate方式传值
ios swift开发中有几种方式传值,看到简书上一篇不错的文章. 链接:http://www.jianshu.com/p/3e1173652996 一.通过segue进行传值 二.通过delegat ...
- web.xml不同版本的头信息
web.xml v2.3 <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web- ...
- Mongoose 基本用法
1. SchemaTypes数据类型 数据类型 描述 String 字符串 Number 数字 Date 日期 Boolean 布尔值 Mixed 混合 Objectid 对象ID Array 数组 ...
- Flutter学习笔记--Dart基础
前言 Flutter使用Dart语言开发, Dart是面向对象编程语言, 由Google2011年推出, 目前最新版本是2.4.0. 工欲善其事,必先利其器. 为了更好的开发Flutter应用, 我们 ...
- Vue中错误图片的处理
在一个Vue的PC项目中,要求给错误图片不要让它显示丑陋的图片,就要给图片写一个失败后的默认图片, 在这里写了两种方法, 第一种方法,也就是百度到的最多的代码,就是给一张图片一个默认值. 第二种问题, ...