Java Finally块的实现
在下面编写的代码中,虽然我没有捕获到Java Finally块的实现,java,Java,在下面编写的代码中,虽然我没有捕获到算术异常,但异常是自动处理的,最后使用块成功执行main()方法的内容。然而,如果我从finally中删除return语句,并将demo作为returning void,那么执行finallyblock后的程序将抛出main线程异常。为什么会这样 public class FinallyDemo { int demo() { try { int a=5/0; } fina
算术异常
,但异常是自动处理的,最后使用块
成功执行main()
方法的内容。然而,如果我从finally中删除return语句,并将demo作为returning void,那么执行finally
block后的程序将抛出main线程异常
。为什么会这样
public class FinallyDemo {
int demo() {
try {
int a=5/0;
}
finally {
System.out.println("Finally Executed");
return 10;
}
}
public static void main(String s[]) {
int a=new FinallyDemo().demo();
System.out.println("Exception Handled");
}
}
因为您从finally
块返回,所以异常被静默处理。您应该永远不要从finally block返回!(好吧,几乎永远不会)
根据Java语言规范:
如果finally块由于原因S而突然完成,那么try语句由于原因S而突然完成(并且原因R被丢弃)
这也意味着,如果您从finally
块中抛出不同的异常,如非法状态异常
,原始异常也将被丢弃。因为您从finally
块中返回
,异常将被静默处理。您应该永远不要从finally block返回!(好吧,几乎永远不会)
根据Java语言规范:
如果finally块由于原因S而突然完成,那么try语句由于原因S而突然完成(并且原因R被丢弃)
这也意味着,如果您从finally
块中抛出不同的异常,如非法状态异常
,原始异常也将被丢弃。finally
块只会吞下您的异常。哇,太多的空白…捕获到异常没有cached@PravatPanda抓住了这个例外,未被捕获;)@AndyPerfect哈哈:)完美的一个。最后
块简单地吞下了你的异常。哇,太多的空白…捕捉到了异常cached@PravatPanda捕获了异常,但未捕获;)@完美的一个。嗯,几乎永远不会。那么,什么时候应该从finally块返回呢?:)JLS的引用并没有解释返回行为,或者说,a中的返回是一个突然的完成吗?@AlexWien我的理解是,来自afinally
的返回确实被认为是“突然的”。@AdamStelmaszczyk老实说,我想不出一个合理的理由,但我也不想听起来过于教条。可能确实有合理的理由放弃一个异常并返回一些其他结果。但是理解这样做所涉及的语义是非常重要的。好吧,几乎永远不会。那么,什么时候应该从finally块返回呢?:)JLS的引用并没有解释返回行为,或者说,a中的返回是一个突然的完成吗?@AlexWien我的理解是,来自afinally
的返回确实被认为是“突然的”。@AdamStelmaszczyk老实说,我想不出一个合理的理由,但我也不想听起来过于教条。可能确实有合理的理由放弃一个异常并返回一些其他结果。但是理解这样做所涉及的语义是非常重要的。