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=http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.20.2]这里[/url]。不过并没有提到return的值的问题。

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

Sun的javac从1.4.2开始就不再生成jst/ret指令来处理异常,而是直接把异常处理的代码嵌在方法里,通过异常表来确定handler的位置。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值