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我的理解是,来自a
finally
返回确实被认为是“突然的”。@AdamStelmaszczyk老实说,我想不出一个合理的理由,但我也不想听起来过于教条。可能确实有合理的理由放弃一个异常并返回一些其他结果。但是理解这样做所涉及的语义是非常重要的。好吧,几乎永远不会。那么,什么时候应该从finally块返回呢?:)JLS的引用并没有解释返回行为,或者说,a中的返回是一个突然的完成吗?@AlexWien我的理解是,来自a
finally
返回确实被认为是“突然的”。@AdamStelmaszczyk老实说,我想不出一个合理的理由,但我也不想听起来过于教条。可能确实有合理的理由放弃一个异常并返回一些其他结果。但是理解这样做所涉及的语义是非常重要的。