异常处理相关 try/finally语句

本文深入探讨了Java中异常处理的细节,特别是finally块的行为及其与return语句的交互方式。文章通过具体示例解释了如何正确使用finally块,以及不当使用return、break等语句可能引发的问题。同时,文中还讨论了如何处理被检查异常,以及final变量的初始化规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 javapuzzler 36 一条语句或一个语句块在它抛出了一个异常,或者对某个封闭型语句执行了一个break 或continue,或是象这个程序一样在方法中执行了一个return 时,将发生意外结束。它们之所以被称为意外结束

 

打印 false

千万不要用一个return、break、continue 或throw 来退出一个finally 语句块,并且千万不要允许将一个受检查的异常传播到一个finally 语句块之外去。

 

2 java puzzler 37

(1)如果一个catch 子句要捕获一个类型为E 的被检查异常,而其相对应的try 子句不能抛出E 的某种子类型的异常,那么这就是一个编译期错误。

(2)但是捕获Exception 或Throwble 的catch 子句是合法的,不管与其相对应的try 子句的内容为何

(3)一个方法可以抛出的被检查异常集合是它所适用的所有类型声明要抛出的被检查异常集合的交集,而不是合集

 

3 java puzzler 38

要确定一个程序是否可以不止一次地对一个空final 进行赋值是一个很困难的问题。事实上,这是不可能的。这等价于经典的停机问题,它通常被认为是不可能解决的[Turing 36]。为了能够编写出一个编译器,语言规范在这一点上采用了保守的方式。在程序中,一个空final 域只有在它是明确未赋过值的地方才可以被赋值。规范长篇大论,对此术语提供了一个准确的但保守的定义[JLS 16]。因为它是保守的,所以编译器必须拒绝某些可以证明是安全的程序。

4 java puzzler 40

(1)System.exit 方法将停止当前线程和所有其他当场死亡的线程。finally 子句的出现并不能给予线程继续去执行的特殊权限。

(2)。通过调用System.halt 可以在不执行关闭挂钩的情况下停止VM。

 

5 java puzzler

(1)第一个错误是该程序使用了一种可怕的循环惯用法,该惯用法依赖的是对数组的访问会抛出异常。这种惯用法不仅难以阅读,
而且运行速度还非常地慢。不要使用异常来进行循环控制。

(2)& 操作符有其他的含义。除了常见的被当作整型操作数的位AND 操作符之外,当被用于布尔操作数时,它的功能被重载为逻辑AND 操作符[JLS15.22.2]。这个操作符与更经常被使用的条件AND 操作符有所不同,& 操作符总是要计算它的两个操作数,而 && 操作符在其左边的操作数被计算为false 时,就不再计算右边的操作数了[JLS 15.23]

(3)逻辑OR 操作符(|)也伴随着条件OR 操作符(||)[JLS 15.22.2,15.24]。| 操作符总是要计算它的两个操作数,而 || 操作符在其左边的操作数被计算为true 时,就不再计算右边的操作数了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值