java只使用try和finally不使用catch的原因和场景
JDK并发工具包中,很多异常处理都使用了如下的结构,如AbstractExecutorService,即只有try和finally没有catch。
class X
{private final ReentrantLock lock = new ReentrantLock();// ...public void m(){lock.lock(); // block until condition holdstry {// ... method body} finally{lock.unlock()}}
}
为什么要使用这种结构?有什么好处呢?先看下面的代码
public void testTryAndFinally(String name){try{name.length();// NullPointerException }finally{System.out.println("aa");}}
传递null该方法的执行结果是:在控制台打印aa,并抛出NullPointerException。执行流程是先执行try块,出现异常后执行finally块,最后向调用者抛出try中的异常。这种执行结果是很正常的,因为没有catch异常处理器,所有该方法只能将产生的异常向外抛;因为有finally,所以会在方法返回抛出异常之前,先执行finally代码块中的清理工作。
这种做法的好处是什么呢?对于testTryAndFinally来说,它做了自己必须要做的事(finally),并向外抛出自己无法处理的异常;对于调用者来说,能够感知出现的异常,并可以按照需要进行处理。也就是说这种结构实现了职责的分离,实现了异常处理(throw)与异常清理(finally)的解耦,让不同的方法专注于自己应该做的事。那什么时候使用try-finally,什么时候使用try-catch-finally呢?很显然这 取决于方法本身是否能够处理try中出现的异常 。如果自己可以处理,那么直接catch住,不用抛给方法的调用者;如果自己不知道怎么处理,就应该将异常向外抛,能够让调用者知道发生了异常。即在方法的签名中声明throws可能出现而自己又无法处理的异常,但是在方法内部做自己应该的事情。
这可以参考ExecutorService.invokeAny()的方法签名
<T> T invokeAny(Collection<? extends Callable<T>> tasks) throws InterruptedException, ExecutionException;
转自 http://blog.csdn.net/aitangyong/article/details/38146833?utm_source=tuicool&utm_medium=referral
转载于:https://www.cnblogs.com/Bonker/p/5407440.html
java只使用try和finally不使用catch的原因和场景相关推荐
- java try单独使用_java只使用try和finally不使用catch的原因和场景
JDK并发工具包中,很多异常处理都使用了如下的结构,如AbstractExecutorService,即只有try和finally没有catch. class X { private final Re ...
- Java文本框只有一行数据,Java只允许输入数目字的文本框
Java只允许输入数字的文本框 package com.han; import javax.swing.JTextField; import javax.swing.text.AttributeSet ...
- java 强制走catch_java – IDE强制使用try / catch包围但不抛出异常
我理解已检查和未检查的异常之间的区别. Java编译器强制程序员使用try / catch块包围已检查的异常,或者在方法签名中添加throw声明. 但是有时我看到在Eclipse中,编译器只给我一个选 ...
- java中的反射原理,为什么要使用反射以及反射使用场景(面试常问)
java中的反射原理,为什么要使用反射以及反射使用场景 什么是反射 反射是框架的灵魂 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够 ...
- BigData:大数据开发的简介、核心知识(linux基础+Java/Python编程语言+Hadoop{HDFS、HBase、Hive}+Docker)、经典场景应用之详细攻略
BigData:大数据开发的简介.核心知识(linux基础+Java/Python编程语言+Hadoop{HDFS.HBase.Hive}+Docker).经典场景应用之详细攻略 BigData:大数 ...
- Java byte类型转换成int类型时需要 0XFF的原因
Java byte类型转换成int类型时需要 & 0XFF的原因 假设有byte b = -1; 那么b的二进制是:1111 1111. 如果将b直接转换为int类型,那么二进制是 1111 ...
- JAVA方法中的参数用final来修饰的原因
JAVA方法中的参数用final来修饰的原因 很多人都说在JAVA中用final来修饰方法参数的原因是防止方法参数在调用时被篡改,其实也就是这个原因,但理解起来可能会有歧义,有的人认为是调用语句的地方 ...
- 打印时总跟出一页计算机主的纸,打印机只打印一页却重复不停打印的原因之一和解决方法...
打印机只打印一页却重复不停打印的原因之一和解决方法 腾讯视频/爱奇艺/优酷/外卖 充值4折起 打印机和电脑配套使用时,会出现各种各样问题,就比如有时候设定只打印一页纸,打印机却重复在打印,今天小编以w ...
- JAVA关于int强转char,打印出乱码的原因
JAVA:关于int强转char,打印出乱码的原因 先看一段代码 public class Test {public static void main(String[] args) {String s ...
最新文章
- g-git 相关命令 及其 基本原理探索 (一)
- ios6:新特征介绍
- vue 全局排序_搞定VUE [ 一 ]
- 计量经济学和机器学习方法的在假设上的区别
- PHP中error_reporting()用法详解
- 字符串-文本对齐方法演练
- 用VML画图(一些基本的矢量图)(转)
- ERP(进纯销)系统如何开发,各类型系统都应该怎么做?
- android socket 代理服务器,Android 使用Socket进行服务器通信
- 说一下php的自动加载,php的_autoload函数实现自动加载类的使用
- 个人介绍网页代码 html静态网页设计制作 dw静态网页成品模板素材网页 web前端网页设计与制作 div静态网页设计
- 2021年PMP考试模拟题3(含答案)
- 求x的n次方编程_C++编程X的N次方程序
- 在centos中运行出现错误:cannot find -lbz2
- JQuery 实现文件下载的常用方法分析
- iov_iter操作
- MEDA: Meta-Learning with Data Augmentation for Few-Shot Text Classification
- 多元统计:相关概念总结
- CPU中运算器的功能
- 使用API函数 GetACP 获取Windows系统当前代码页(字符编码)
热门文章
- 浅谈C++设计模式之工厂方法(Factory Method)
- hadoop关联文件处理
- visudo精确用户赋权(sudo)
- XSHELL下直接下载文件到本地(Windows)
- android recyclerview 横向item 宽度,RecyclerView的item宽度不能全屏显示及线性布局与grid布局切换混乱解决方法...
- 少儿编程150讲轻松学Scratch(十二)-用Scratch制作石头剪子布游戏
- matlab_ga(),matlab遗传算法ga函数
- python关键字详解_Python 中的关键字with详解
- ftp服务器上传文件提示451,解决IIS7之FTP部分文件上传451错误
- 机制 linux_从一道面试题谈linux下fork的运行机制