只使用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可能出现而自己又无法处理的异常,但是在方法内部做自己应该的事情。

finally语句不会被执行的情况Java的finally语句不会被执行的唯一情况是:先执行了用于终止程序的System.exit()方法

public class Test

{

public static void main(String[] args)

{

try

{

System.out.println("Start");

System.exit(0);

}finally

{

System.out.println("Finally");

}

System.out.println("End");

}

}

输出结果为:

Start

当然,如果在执行一般的没有System.exit()语句的try语句时,突然断电了,这时所有进程都会终止,也不会执行finally语句。

java 异常的分类并举例_Java异常处理中的一些特殊情况举例相关推荐

  1. java怎么碰到异常跳过继续执行_Java异常处理很难吗?BAT大厂的架构师是怎么处理Java异常的?...

    欢迎关注专栏<Java架构筑基>--专注于Java技术的研究与分享! Java架构筑基​zhuanlan.zhihu.com Java架构筑基--专注于Java技术的研究与分享! 后续文章 ...

  2. java中在方法体内抛出异常_Java异常处理中___用于方法体内,抛出一个异常对象。...

    Java异常处理中___用于方法体内,抛出一个异常对象. 答: throw; 智慧职教: 运输高致病性动物病原微生物菌(毒)种或者样本的,与内包装要求错误的是 答:E.主容器表面标注"高致病 ...

  3. Java异常日志的查询语句_java学习异常,断言和日志

    1.异常处理的任务就是将控制权从错误产生的地方转移给能够处理这种情况的错误处理器 2.错误分类 用户输入错误 设备错误 物理限制 代码错误 3.异常分类,所有的异常都是由Throwable继承而来,有 ...

  4. java异常体系分类(面试)

    java异常体系分为2类 1.错误(Error),一般与虚拟机.系统有关.这一类的错误无法由程序捕获,程序中断,比如内存溢出. 2.异常(Execption),一般有程序编码或者设计导致的错误,可以由 ...

  5. java方法带参数返回值_Java方法中的参数太多,第6部分:方法返回

    java方法带参数返回值 在当前的系列文章中,我正在致力于减少调用Java方法和构造函数所需的参数数量,到目前为止,我一直专注于直接影响参数本身的方法( 自定义类型 , 参数对象 , 构建器模式 , ...

  6. java私有属性和私有方法_Java 9中什么是私有的?

    java私有属性和私有方法 在进行面试时,我发现大多数应聘者都不知道Java中的private修饰符真正意味着什么. 他们对此有所了解,足以应付日常编码,但还远远不够. 这不成问题. 足够了解就足够了 ...

  7. java什么是反射 代码说明_java编程中,常提到的反射代码指的是什么?

    展开全部 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态e5a48de588b662616964757a686964616f31333335326232或行 ...

  8. java组合与继承始示例_Java示例中的组合

    java组合与继承始示例 Composition in java is the design technique to implement has-a relationship in classes. ...

  9. java编程应该要的英语_java编程中常用英语单词

    JAVA 省略语与名词解释 -------------------------------- J2EETM----JavaTM 2PlatformEnterpriseEdition : J2EE(JA ...

最新文章

  1. 实现Jitsi SFU自动关闭/启动视频层
  2. LeetCode 459. 重复的子字符串(数学)
  3. Emacs基本快捷键
  4. swagger map示例_Android Google Map Street View示例
  5. ustc FreeBSD / rust 镜像源
  6. 挖金矿 详解(C++)
  7. 安装protobuf
  8. 《离散数学及其应用》章节总结与github地址
  9. 计算机哪个信息是硬盘大小,查看电脑硬盘大小_电脑硬盘大小怎么看
  10. 全球最大的同性交友网站,竟然还有这些骚操作
  11. 计算机主机ppt课件,怎么用电脑制作ppt课件
  12. vue3如何去掉控制台的warn信息
  13. git错误集(updating)
  14. python多元线性回归报错(assert pytype not in (tokenize.NL, tokenize.NEWLINE))
  15. 如何用迅捷PDF转换器获取PDF文件中的图片
  16. 清华应届程序员同时被5家公司录取,晒出工资,网友:羡慕
  17. BloomFilter在Drois中的应用
  18. 马无夜草不肥,人无横财不富
  19. 任天堂游戏服务器系统,买个服务器当电脑主机如何确保买到新版任天堂Switch游戏主机?...
  20. 视频画面滚动字幕怎么做,让你几分钟学会的方法

热门文章

  1. LeetCode简单题之将找到的值乘以2
  2. 2022年新能源汽车产业集群百人会
  3. 英特尔 QLC 3D NAND 数据存储
  4. 硬件加速器为人工智能应用服务
  5. 工业4.0是个白日梦吗?
  6. java读取文本单词_使用Java计算文本文件中的单词数
  7. 吴恩达Drive.ai因经营困难“卖身”苹果
  8. flutter中的路由跳转
  9. NuGet学习笔记(1) 初识NuGet及快速安装使用
  10. ubuntu16.06+vsftpd+nginx搭建图片服务器