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的工作原理到底是什么?谢谢。

解决方案 »

  1.   

    try中的return是否执行过了?
    没有
    jvm 遇到这种在 try 或者 在 catch 中有return 的时候
    就先去把 finally 中的语句给执行了
     本例中 finally 中有 return 故 try 中的 return 没执行
      

  2.   

    finally的返回结果将前面的覆盖掉了这个问题再《java解惑》一书中有详尽的描述,去下载来看看吧!
      

  3.   

    谜题36:优柔寡断
    下面这个可怜的小程序并不能很好地做出其自己的决定。它的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解惑》
      

  4.   

    finally块中的程序总会执行,执行的时间是在调用return 之前,故在try中调用return “0”之前去执行finally块中的代码,所以返回1
      

  5.   

    字节码如下:
    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了,但是被后来的覆盖掉了
      

  6.   

    http://blog.csdn.net/ZangXT/archive/2009/05/21/4206672.aspx
      

  7.   

    finnally就是不管你程序出现什么问题,是执行try中的代码还是catch中的代码,最后总是会执行finnally中的代码
      

  8.   


    呵呵,还真见过..其实像这种情况出现时,IDE会给警告的,至少eclipse会。
      

  9.   

    finaly语句,无论是try语句是否抛出异常最后都要执行的,所以,会出现上面的结果的,