public class FinallyTest {    public static String getString(String s) {        try {
            return s;
        } catch (Exception e) {
            e.printStackTrace();
            return e.toString();
        } finally {
            System.out.println("Run Finally");
        }
    }    public static void main(String[] args) {        String s = getString("return test...");
        System.out.println(s);
    }
}
运行结果:
Run Finally
return test...请解释一下为什么会先finally后return?

解决方案 »

  1.   

    都return 了finally还哪有机会执行了.return 就会把方法结束了
      

  2.   

    这就是finally的作用啊。
    如果返回或者抛出异常,finally里的code一定被执行,并且是在return或throw前执行。
      

  3.   

    这个是很正常的啊.你在执行getString("return test...");这时就要调用这个方法中的finally里的内容了.
    然后程序才执行到System.out.println(s);
    finally是这个方法完成后要执行的东西.你别理解成main方法后才能执行的东东.呵呵.
      

  4.   

    无论出现还是不出现异常,finally都要执行。
    你先调用getString()输出Run Finally
    然后又执行System.out.println(s)输出:return test... 
      

  5.   

    finally一定是会执行的,你可以在finally中再写个return语句看看,测试一下.
      

  6.   

    首先执行finally,然后才执行return....
      

  7.   


    我还没傻到像你说的那样理解if(先执行finally){
       Run Finally 先打印;
    }else{
       return test... 先打印;
    }这段代码我只是想知道先执行return还是先执行finally而已。
      

  8.   

    我不知道为什么你这样问,可能我还没看到问题的所在,但是我觉得,当执行完return s;语句之后,
    getString(String)方法理所当然要执行finally 的内容..System.out.println("Run Finally");
    然后main()方法再执行System.out.println(s);
    所以你的运行结果当然是
    Run Finally 
    return test...
    不对的地方,还请指教 
      

  9.   

    不管是否抛出异常,finally里的代码一定要执行,这是规则。
    再说return就退出了
      

  10.   

    String s = getString("return test...");
    你这句是运行了return s;但却没有输出,接着又执行finally,当然Run finally;
    而后来才System.out.println(s);当然是接着Run finally后输出的啊!
      

  11.   

    各位。这种问题还在这里讨论,有意思吗?
    这都不会?
    别玷污了java这个词。finally的存在,就是为了不管程序发生了什么情况,他都会执行
      

  12.   

    事先规定的。规则规定的。sun规定的。如果返回或者抛出异常,finally里的code一定被执行,并且是在return或throw前执行。
      

  13.   

    看来是我的理解有误,4楼说的还是有道理的。
    这样确实无法证实先走finally还是return。
    不过大家可以debug一下,确实是先走的finally。
      

  14.   

     class FinallyTest {    public static void getString(String s) {        try {
                //return s;
                System.out.println(s);
               // return "";
            } catch (Exception e) {
                e.printStackTrace();
                //return e.toString();
                
            } finally {
                System.out.println("Run Finally");
            }
        }    public static void main(String[] args) {        getString("return test...");
           // System.out.println(s);
        }
    }
    //看下这个结果,可能会更明白点。