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...险恶啊
发布评论