多个回报:哪一个设置最终的回报值?
鉴于此代码:
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
块返回一些东西,它将会取代try
或catch
块可能返回的任何东西。
例外情况也是如此。 如果你在finally
块中抛出一些东西,这个exception将会replacetry
或catch
块中抛出的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