public class Test{
public static void main(String [] args){
System.out.println(new Test().getResult());
} public String getResult(){
try{
return "0";
}
finally{
return "1";
}
}
}请问try中的return是否产生过什么效果。我用debug调试了一下程序走到try中的return 然后进入finally代码块中,去网上查资料,大部分说的finally与别的关键字的区别,而无人说至此点。请高手帮忙解答一下,为什么会产生这种结果?try中的return是否执行过了?JVM是怎么处理这种情况的,也就是finally的工作原理到底是什么?谢谢。
public static void main(String [] args){
System.out.println(new Test().getResult());
} public String getResult(){
try{
return "0";
}
finally{
return "1";
}
}
}请问try中的return是否产生过什么效果。我用debug调试了一下程序走到try中的return 然后进入finally代码块中,去网上查资料,大部分说的finally与别的关键字的区别,而无人说至此点。请高手帮忙解答一下,为什么会产生这种结果?try中的return是否执行过了?JVM是怎么处理这种情况的,也就是finally的工作原理到底是什么?谢谢。
没有
jvm 遇到这种在 try 或者 在 catch 中有return 的时候
就先去把 finally 中的语句给执行了
本例中 finally 中有 return 故 try 中的 return 没执行
下面这个可怜的小程序并不能很好地做出其自己的决定。它的decision方法将返回true,但是它还返回了false。那么,它到底打印的是什么呢?甚至,它是合法的吗?
public class Indecisive {
public static void main(String[] args) {
System.out.println(decision());
}
static boolean decision() {
try {
return true;
} finally {
return false;
}
}
}你可能会认为这个程序是不合法的。毕竟,decision方法不能同时返回true和false。如果你尝试一下,就会发现它编译时没有任何错误,并且它所打印的是false。为什么呢?
原因就是在一个try-finally语句中,finally语句块总是在控制权离开try语句块时执行的[JLS 14.20.2]。无论try语句块是正常结束的,还是意外结束的,情况都是如此。一条语句或一个语句块在它抛出了一个异常,或者对某个封闭型语句执行了一个break或continue,或是象这个程序一样在方法中执行了一个return时,将发生意外结束。它们之所以被称为意外结束,是因为它们阻止程序去按顺序执行下面的语句。当try语句块和finally语句块都意外结束时,在try语句块中引发意外结束的原因将被丢弃,而整个try-finally语句意外结束的原因将于finally语句块意外结束的原因相同。在这个程序中,在try语句块中的return语句所引发的意外结束将被丢弃,而try-finally语句意外结束是由finally语句块中的return造成的。简单地讲,程序尝试着(try)返回(return)true,但是它最终(finally)返回(return)的是false。丢弃意外结束的原因几乎永远都不是你想要的行为,因为意外结束的最初原因可能对程序的行为来说会显得更重要。对于那些在try语句块中执行break、continue或return语句,只是为了使其行为被finally语句块所否决掉的程序,要理解其行为是特别困难的。总之,每一个finally语句块都应该正常结束,除非抛出的是不受检查的异常。千万不要用一个return、break、continue或throw来退出一个finally语句块,并且千万不要允许将一个受检查的异常传播到一个finally语句块之外去。对于语言设计者,也许应该要求finally语句块在未出现不受检查的异常时必须正常结束。朝着这个目标,try-finally结构将要求finally语句块可以正常结束[JLS 14.21]。return、break或continue语句把控制权传递到finally语句块之外应该是被禁止的,任何可以引发将被检查异常传播到finally语句块之外的语句也同样应该是被禁止的。——————摘自《java解惑》
public java.lang.String getResult();
Code:
Stack=1, Locals=3, Args_size=1
0: ldc #7; //String 0 //把常量“0”压栈
2: astore_1 //存到局部变量1里面
3: ldc #8; //String 1 //把常量“1”压栈
5: areturn //然后将其压入调用方法栈幁内的操作数栈
6: astore_2 //存到变量2里面
7: ldc #8; //String 1 //把常量“1”压栈
9: areturn //然后将其压入调用方法栈幁内的操作数栈
看来,确实return了,但是被后来的覆盖掉了
呵呵,还真见过..其实像这种情况出现时,IDE会给警告的,至少eclipse会。