2013-10-03 128 views
1

在下面写的代码中虽然我还没有抓到ArithmeticException,但是自动处理异常并用finally块,main()方法的内容成功执行。而如果我从最后删除返回语句,并使演示为返回无效然后程序执行finally块后抛出MainThreadException ..为什么这样呢?最后一块的执行

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"); 
    } 
} 
+3

'finally'块只会吞噬你的异常。 –

+4

哇,*方式*太多空白... – chrylis

+0

发现异常没有缓存 –

回答

4

因为你returnfinally块,异常被悄悄地设置。你应该从来没有从一个finally块返回! (好吧,几乎永远不会)。

Java语言规范

如果最后块原因小号突然完成,则try语句为原因小号突然结束(和原因R舍弃)。

这也意味着,如果你把一个不同的异常,像一个IllegalStateException,从finally块,原始的异常也将被丢弃。

+1

*好吧,几乎永远都不会。*那么,什么时候应该从最后一块回来? :) –

+1

JLS的引用没有解释返回行为,还是在最终的突然完成中返回? – AlexWien

+0

@AlexWien我的理解是,来自'finally'的'return'确实被认为是“突然的”。 –