为什么在最终有return子句时没有异常

时间:2016-06-22 01:53:39

标签: java try-catch-finally

代码捕捉如下所示:

public static void main(String[] args) {
    System.out.println(echo("jjj"));
}

public static String echo(String str) {
    try {
        int a = 1/0;
    } catch (Exception e) {
        throw e;
    } finally {
        return str;
    }
}

为什么我可以获得输出并且不会发生异常? 如果我最后退出return子句,那么就会发生异常 return(在finally中)如何停止exception

1 个答案:

答案 0 :(得分:1)

Java Language Specification section 14.20.2中明确指出了此行为,其中包含:

  

首先执行带有finally块的try语句   试块。然后有一个选择:

     
      
  • 如果try块的执行正常完成,那么finally   块被执行,然后有一个选择:

         
        
    • 如果finally块正常完成,则try语句正常完成。

    •   
    • 如果finally块因原因S而突然完成,则try语句突然完成,原因是S。

    •   
  •   
  • 如果由于a而导致try块的执行突然完成   抛出一个值V ,然后有一个选择:

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

           
          
      • 如果catch块正常完成,则执行finally块。然后有一个选择:

             
            
        • 如果finally块正常完成,则try语句正常完成。

        •   
        • 如果finally块因任何原因突然完成,则try语句会因同样的原因突然完成。

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

             
            
        • 如果finally块正常完成,则try语句突然完成,原因为R。

        •   
        • 如果finally块因为S而突然完成,则try语句突然完成,原因是S(和原因R)   被丢弃了。

        •   
      •   
    •   
  •   

(请注意"抛出异常""返回值"算作"突然完成。")