finally子语里的return...险恶啊

编程入门 行业动态 更新时间:2024-10-27 00:25:33

<a href=https://www.elefans.com/category/jswz/34/1755372.html style=finally子语里的return...险恶啊"/>

finally子语里的return...险恶啊

看看这段代码,
TestFinally.java:
public class TestFinally {
public static void main(String[] args) {
System.out.println(foo(-1));
System.out.println(foo(1));
}

private static boolean foo(int value) {
try {
if (value < 0) {
return false;
} else {
return true;
}
} finally {
return false;
}
}
}

运行的话会看到怎样的结果呢?

[code]D:\temp>javac TestFinally.java

D:\temp>java TestFinally
false
false[/code]

于是两次对foo()的调用都返回了false。嗯?
foo()里,控制流不是应该在try语句块里就返回了么?try里的两条分支,无论哪条应该返回才对啊?
但是同时,我们也知道finally语句块一定会在try-catch语句之后执行一次。
[quote="Java Language Specification, 3rd"]A finally clause ensures that the finally block is executed after the try block and any catch block that might be executed, no matter how control leaves the try block or catch block.[/quote]
如果finally里的不是return那很好理解,但偏偏这里就是return语句……

Java Language Specification, 3rd里的对try-catch-finally语句执行的规定在[url=.html#14.20.2]这里[/url]。不过并没有提到return的值的问题。

唉,总之那啥……虽然很合理,但Java里的这finally子句的处理还是很诡异。居然能改写返回值,让一般的控制流与异常处理变得不怎么正交了 = =

Sun的javac从1.4.2开始就不再生成jst/ret指令来处理异常,而是直接把异常处理的代码嵌在方法里,通过异常表来确定handler的位置。

更多推荐

finally子语里的return...险恶啊

本文发布于:2024-02-17 05:12:03,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1692777.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:险恶   finally   子语里   return

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!