使用finally的java中的异常处理

时间:2015-04-03 15:50:27

标签: java exception exception-handling

public class CheckProg {
    public int math(int i) {
        try {
            int result = i / 0;
       // throw new IOException("in here");
        } catch (Exception e) {
            return 10;
        } finally {
            return 11;
        }
    }
    public static void main(String[] args) {
        CheckProg c1 = new CheckProg();
        int res = c1.math(10);
        System.out.println("Output :" + res);
   }

问题:如果我运行上面的代码,我得到的结果为输出:11

为什么呢?不应该在catch块之前捕获异常并返回吗?

5 个答案:

答案 0 :(得分:7)

  

不应该在catch块之前捕获异常并返回吗?

捕获,并且返回语句正在执行 ...但是返回值正被{{1中的return语句有效替换阻止,无论是否存在异常都会执行。

有关所有可能性的详细信息,请参阅JLS 14.20.2。在您的情况下,这是路径:

  

如果由于抛出值V而导致try块的执行突然完成,那么可以选择:

     
      
  • 如果V的运行时类型与try语句的任何catch子句的可捕获异常类兼容,则选择第一个(最左边)这样的catch子句。值V分配给所选catch子句的参数,并执行该catch子句的Block。然后有一个选择:

         
        
    • 如果catch块正常完成 [...忽略,因为它没有]

    •   
    • 如果catch块因为R而突然完成,则执行finally块。然后有一个选择:

           
          
      • 如果finally块正常完成 [...忽略,因为它没有]

      •   
      • 如果finally块因为S而突然完成,那么try语句突然完成原因S(并且原因R被丢弃)。

      •   
    •   
  •   

因此底线是重要的 - “原因S”(在我们的例子中,返回值11)最终成为finally语句突然完成的方式。

答案 1 :(得分:1)

是。但是finally块总是在事后执行并且否决了返回值!

答案 2 :(得分:0)

最后,无论是否发生异常,都会执行块。

答案 3 :(得分:0)

这几乎是不言自明的。 Catch块正在执行,因为存在异常。最终将执行,因为它的执行得到保证而不管异常。

注意 - 如果您已经提供了一些其他陈述而不是返回,两个陈述都已执行。但是如果返回,则只执行最后一次返回。

} catch (Exception e) {
                System.out.println("10");
            } finally {
                System.out.println("11");
            }

答案 4 :(得分:0)

“finally”关键字用于创建try块后面的代码块。无论是否发生异常,总是会执行最后一段代码。

试 {

final int x=100;
System.out.println("The value of x is"+ x);

}

catch(Exception e)
{
    System.out.println(e);  
}
finally
{
    System.out.println("Finally Block executed");
}