多个回报:哪一个设置最终的回报值?

鉴于此代码:

String test() { try { return "1"; } finally { return "2"; } } 

语言规范是否定义了调用test()的返回值? 换句话说:每个JVM都一样吗?

在Sun JVM中,返回值是2 ,但我想确定这不是依赖于VM的。

是的, 语言规范定义“2”是结果。 如果一个虚拟机做不同的事情,它不符合规范。

大多数编译器会抱怨。 例如,Eclipse会声称返回块永远不会被执行,但这是错误的。

编写这样的代码是一个令人震惊的不好的做法,千万不要这样做:)

是的, Java语言规范在这个问题上非常明确( 14.20.2 ):

带有finally块的try语句通过首先执行try块来执行。 那么有一个select:

  • 如果try块的执行正常完成,
  • 如果try块的执行由于抛出一个值V而突然完成,
  • 如果try块的执行由于其他原因R而突然完成,则执行finally块。 那么有一个select:
    • 如果finally块正常结束,
    • 如果finally块由于S原因而突然完成,则对于原因S,try语句突然完成(并且原因R被丢弃)。

finally代码块将一直执行,除了下面的例子:

 String test() { try { System.exit(0); } finally { return "2"; } } 

在这种情况下,JVM将停止,不执行finally块。

所以在你的例子中,返回值是2

是的,如果你从finally块返回一些东西,它将会取代trycatch块可能返回的任何东西。

例外情况也是如此。 如果你在finally块中抛出一些东西,这个exception将会replacetrycatch块中抛出的exception。 所以要小心,不要在finally块中抛出一些东西,因为它可能会隐藏原来的失败原因。

读取程序的ByteCode后,代码如下:

finally块语句在try块的return语句之前被内联,所以finally块的返回首先执行,而原始的return语句永远不会执行。

对于程序:

 String test() { try { System.out.println("try"); return "1"; } finally { System.out.println("finally"); return "2"; } } 

它转换为:

 String test() { System.out.println("try"); String s = "1"; //temporary variable System.out.println("finally"); return "2"; Exception exception; exception; System.out.println("finally"); return "2"; } 

对于程序:与catch块:

 String test() { try { System.out.println("try"); return "1"; } catch (RuntimeException e) { System.out.println("catch"); return "2"; } finally { System.out.println("finally"); return "3"; } } 

转换为:

 String test() { System.out.println("try"); String s = "1"; System.out.println("finally"); return "3"; RuntimeException e; e; System.out.println("catch"); String s1 = "2"; System.out.println("finally"); return "3"; Exception exception; exception; System.out.println("finally"); return "3"; } 

注意:遵循使用JDK 1.7&使用Cavaj进行反编译。

你可以参考下面的链接。 我希望它会提供所有的细节:

http://www.programmerinterview.com/index.php/java-questions/will-finally-run-after-return/

它说finally块总是会执行甚至try catch块有return语句。 如果finally块也有return语句,那么这将覆盖try或catch块内部的return语句,在这种情况下try / catch中抛出的任何exception都将被丢弃(坏的方法)。

谢谢Chethan