java try catch finally - 返回

时间:2014-04-08 23:38:46

标签: java

试一试try最后用例 -

public class Finallyy {
    public static void main(String[] args) {
        int result = method1();
        System.out.println(result);
    }

    private static int method1() {
        int a = 2;
        try {
            int b = 0;
            a = a / a;
            System.out.println("try");
            return a;
        } catch (Exception e) {
            System.out.println("caught");
            a = 5;
            return a;
        }
        finally {
            System.out.println("finally");
            a = 10;
            return a;
        }
    }
}

输出:

try

finally

10
  

如果代码修改为

finally {
            System.out.println("finally");
            a = 10;
            //return a;
        }

输出:

try

finally

1

问题 - 是否存在堆栈的概念,其中return a块中的“try”存储[如果示例被更改,则它适用于尝试或捕获阻止],并且当控件在method1()块中没有“return”时离开finally时弹出?

更新:解决方案结束:

执行return语句时,将存储要返回的值。当finally块完成时,返回该值。

finally块始终作为最后执行。所以finally块中的返回OVERWRITES,其他返回try / catch块。由于这个原因,从finally块返回或抛出异常是一种非常糟糕的做法。

那么对于原始问题 - 只有在return块中没有“finally”时才会出现这种情况吗?没有。没关系。

修改

这个问题在4月8日被问到并且已经回答了。目前标记为重复的问题是日后[8月15日]提出的问题。因此,新问题应被标记为重复,而不是这个。然而,分享参考类似的问题是好的。

3 个答案:

答案 0 :(得分:2)

try阻止在finally阻止之前执行。

执行return语句时,将存储要返回的值。当finally块完成时,将返回该值。

请注意,a不是值。 a是存储值的变量。如果您更改a,则更改a,则不会更改为return存储的值。

由于技术原因,我们转到Java Language Specification on the try-finally block

  

如果由于任何其他原因导致try块的执行突然完成   R,然后执行finally块,然后有一个选择:

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

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

  •   

A return statement completes abruptly,如果try finally return finallyreturn也有finallyreturn 1}} try取代{{1}}。

答案 1 :(得分:1)

finally块始终作为最后执行。所以finally块中的返回OVERWRITES,其他返回try / catch块。 由于这个原因,从finally块返回或抛出异常是一种非常糟糕的做法。

与堆栈无关:它是一个事实,即finally块总是作为最后一个块执行,因此finally块中返回或抛出的内容将擦除并覆盖任何先前的退出值(返回的对象或抛出异常)。

试试这个:

try {
    throw new NullPointerException();
}
finally {
    return 0;
}

finally块中的return将覆盖(吞下)NullPointerException ......

答案 2 :(得分:0)

try..catch..finally实际上是在try..catch(" any")中编译为嵌套的try..catch(你指定的例外),以及&# 34;最后"块被切断&编译器粘贴到" end"每个代码路径。 (我把"结束"用引号括起来,因为我无法记住它是如何处理来自"尝试"或" catch&#34的多个退出;阻止。)您可以使用javap命令(反汇编程序)来试验您的Java版本生成的字节代码,以对应不同的try..catch..finally组合。