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 holds
	try
	{
		// ... 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;
时间: 2024-11-09 04:42:14

java只使用try和finally不使用catch的原因和场景的相关文章

[转载]Java中异常的捕获顺序(多个catch)

http://blog.sina.com.cn/s/blog_6b022bc60101cdbv.html [转载]Java中异常的捕获顺序(多个catch) (2012-11-05 09:47:28) 转载▼ 标签: 转载 分类: 转载 原文地址:Java中异常的捕获顺序(多个catch)作者:leesa Java代码 import java.io.IOException; public class ExceptionTryCatchTest { public void doSomething(

我们的java商城开发技术人员概括采用分布式开发的原因

在做电子商务网站建设中,java语言要比其他的语言安全性相对要高一些,而且使java商城开发的产品它的跨平台性相比其他语言也要好一点.而且java在开发jsp商城网站中还有一个优势,那就是可以采用一些开发技术来提高网站的运行速度,这个技术就是现在很多开发企业比较看重的分布式开发. 在介绍分布式开发的时候,我们先来一段插曲,那就是关于火车站的售票系统的开发.在12306.cn网站刚刚开通网上售票功能的时候,我们会发现,在买票的时候经常出现网站崩溃或是服务器无响应或是网站进不去等等问题,这个就是在开

Java byte类型转换成int类型时需要 &amp; 0XFF的原因

Java byte类型转换成int类型时需要 & 0XFF的原因 假设有byte b  = -1; 那么b的二进制是:1111 1111. 如果将b直接转换为int类型,那么二进制是 1111 1111 1111 1111 1111 1111 1111 1111,这显然就不对了. 所以要与b进行&运算 0XFF的二进制是 0000 0000 0000 0000 0000 0000 1111 1111 那么运算之后到结果就是 0000 0000 0000 0000 0000 0000 111

“全栈2019”Java第八十七章:类中嵌套接口的应用场景(拔高题)

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第八十七章:类中嵌套接口的应用场景(拔高题) 下一章 "全栈2019"Java第八十八章:接口中嵌套接口的应用场景 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复"J

“全栈2019”Java第八十八章:接口中嵌套接口的应用场景

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第八十八章:接口中嵌套接口的应用场景 下一章 "全栈2019"Java第八十九章:接口中能定义内部类吗? 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复"Java学习

“全栈2019”Java第一百一十三章:什么是回调?回调应用场景详解

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第一百一十三章:什么是回调?回调应用场景详解 下一章 "全栈2019"Java异常第一章:什么是异常? 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复"Java学习小

学好Java只需要做到这7点,年薪20W很简单~

大道至简,所以扎实有用的方法,其实都是很简单的,难在踏踏实实的执行过程.今天为大家介绍的就是Java学习的7个看起来非常简单的方法,快学起来吧. 为什么要学习java? Java是目前最流行的编程语言,主流公司框架基本上都离不开Java的影子,未来还会火很多年.Java应用范围极其广泛,无论在客户端还是在服务端都有. 如何学习Java? 首先设计一个大致的学习纲领或者计划,无规矩不成方圆,没有规划没有方向去学习,很容易让自己走死胡同,造成中间半途而废. 第一步 搭建编译运行第一个hello wo

Java 只允许输入11位数字的输入框,手机号

<input id="add_phone" style="width: 160px;" onkeyup="value=value.replace(/[^\d]/g,'') " onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))" /></td>

Java知多少(46)try和catch的使用

尽管由Java运行时系统提供的默认异常处理程序对于调试是很有用的,但通常你希望自己处理异常.这样做有两个好处.第一,它允许你修正错误.第二,它防止程序自动终止.大多数用户对于在程序终止运行和在无论何时错误发生都会打印堆栈轨迹感到很烦恼(至少可以这么说).幸运的是,这很容易避免. 为防止和处理一个运行时错误,只需要把你所要监控的代码放进一个try块就可以了.紧跟着try块的,包括一个说明你希望捕获的错误类型的catch子句.完成这个任务很简单,下面的程序包含一个处理因为被零除而产生的Arithme