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的原因和场景相关推荐

  1. java try单独使用_java只使用try和finally不使用catch的原因和场景

    JDK并发工具包中,很多异常处理都使用了如下的结构,如AbstractExecutorService,即只有try和finally没有catch. class X { private final Re ...

  2. Java文本框只有一行数据,Java只允许输入数目字的文本框

    Java只允许输入数字的文本框 package com.han; import javax.swing.JTextField; import javax.swing.text.AttributeSet ...

  3. java 强制走catch_java – IDE强制使用try / catch包围但不抛出异常

    我理解已检查和未检查的异常之间的区别. Java编译器强制程序员使用try / catch块包围已检查的异常,或者在方法签名中添加throw声明. 但是有时我看到在Eclipse中,编译器只给我一个选 ...

  4. java中的反射原理,为什么要使用反射以及反射使用场景(面试常问)

    java中的反射原理,为什么要使用反射以及反射使用场景     什么是反射 反射是框架的灵魂 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够 ...

  5. BigData:大数据开发的简介、核心知识(linux基础+Java/Python编程语言+Hadoop{HDFS、HBase、Hive}+Docker)、经典场景应用之详细攻略

    BigData:大数据开发的简介.核心知识(linux基础+Java/Python编程语言+Hadoop{HDFS.HBase.Hive}+Docker).经典场景应用之详细攻略 BigData:大数 ...

  6. Java byte类型转换成int类型时需要 0XFF的原因

    Java byte类型转换成int类型时需要 & 0XFF的原因 假设有byte b  = -1; 那么b的二进制是:1111 1111. 如果将b直接转换为int类型,那么二进制是 1111 ...

  7. JAVA方法中的参数用final来修饰的原因

    JAVA方法中的参数用final来修饰的原因 很多人都说在JAVA中用final来修饰方法参数的原因是防止方法参数在调用时被篡改,其实也就是这个原因,但理解起来可能会有歧义,有的人认为是调用语句的地方 ...

  8. 打印时总跟出一页计算机主的纸,打印机只打印一页却重复不停打印的原因之一和解决方法...

    打印机只打印一页却重复不停打印的原因之一和解决方法 腾讯视频/爱奇艺/优酷/外卖 充值4折起 打印机和电脑配套使用时,会出现各种各样问题,就比如有时候设定只打印一页纸,打印机却重复在打印,今天小编以w ...

  9. JAVA关于int强转char,打印出乱码的原因

    JAVA:关于int强转char,打印出乱码的原因 先看一段代码 public class Test {public static void main(String[] args) {String s ...

最新文章

  1. g-git 相关命令 及其 基本原理探索 (一)
  2. ios6:新特征介绍
  3. vue 全局排序_搞定VUE [ 一 ]
  4. 计量经济学和机器学习方法的在假设上的区别
  5. PHP中error_reporting()用法详解
  6. 字符串-文本对齐方法演练
  7. 用VML画图(一些基本的矢量图)(转)
  8. ERP(进纯销)系统如何开发,各类型系统都应该怎么做?
  9. android socket 代理服务器,Android 使用Socket进行服务器通信
  10. 说一下php的自动加载,php的_autoload函数实现自动加载类的使用
  11. 个人介绍网页代码 html静态网页设计制作 dw静态网页成品模板素材网页 web前端网页设计与制作 div静态网页设计
  12. 2021年PMP考试模拟题3(含答案)
  13. 求x的n次方编程_C++编程X的N次方程序
  14. 在centos中运行出现错误:cannot find -lbz2
  15. JQuery 实现文件下载的常用方法分析
  16. iov_iter操作
  17. MEDA: Meta-Learning with Data Augmentation for Few-Shot Text Classification
  18. 多元统计:相关概念总结
  19. CPU中运算器的功能
  20. 使用API函数 GetACP 获取Windows系统当前代码页(字符编码)

热门文章

  1. 浅谈C++设计模式之工厂方法(Factory Method)
  2. hadoop关联文件处理
  3. visudo精确用户赋权(sudo)
  4. XSHELL下直接下载文件到本地(Windows)
  5. android recyclerview 横向item 宽度,RecyclerView的item宽度不能全屏显示及线性布局与grid布局切换混乱解决方法...
  6. 少儿编程150讲轻松学Scratch(十二)-用Scratch制作石头剪子布游戏
  7. matlab_ga(),matlab遗传算法ga函数
  8. python关键字详解_Python 中的关键字with详解
  9. ftp服务器上传文件提示451,解决IIS7之FTP部分文件上传451错误
  10. 机制 linux_从一道面试题谈linux下fork的运行机制