关于finally关键字,一直知道,finally代码块里面的代码是肯定会执行的。
但是,对于里面有return的,还是想问问
代码如下static int test(){
try {
System.out.println("try");
return 1;
} finally{
System.out.println("finally");
return 2;
}
}最后代码返回的是2。我再试了一下抛异常的,结果也是抛finally的异常。
代码如下static void testFinally() throws Exception{
try {
throw new Exception("try");
} finally{
throw new Exception("finally");
}
}最后抛出的异常是finally我现在想知道的是,代码执行到try代码块的时候,有return语句或者throw语句,怎么就不直接return?
是说jvm会先看看有没有finally代码块?有的话就不return了,而是执行finally代码块里面的代码?--------
在发帖中,我也在想。是不是因为,如果在try里面直接return或者throw,finally里面的代码就执行不了了?

解决方案 »

  1.   

    再写代码试了一下,发现在上面的猜想也不对。
    try里面的return 语句是会先于finally代码块执行的
    代码如下
    static int test(){
    try {
    System.out.println("try");
    return print();
    } finally{
    System.out.println("finally");
    return 2;
    }
    }
    static int print(){
    System.out.println("print");
    return 1;
    }
    //输出结果是
    //try
    //print 
    //finally
    //2
      

  2.   

    http://www.2cto.com/kf/201010/76754.html
      

  3.   


    finally代码块里的内容确实是必然执行的。
    你这个代码里之所以会有try里的return是因为return print()先执行了print(),
    这时会打印print,然后执行return的时候因为发现有finally,所以会在return之前执行finally中的return。而try中的return并没有执行。
      

  4.   

    finally里放的是一定执行的代码。
      

  5.   

    不论try是抛出异常还是return,finally都会执行
      

  6.   

    只要执行了try里的语句  finally 的语句一定会执行,  向lz说的 如果在try中出现了return  x;x如果是函数,他会先执行,最后把 返回值  放到一个容器中,再执行finally  ,如果finally中有 return的值  ,则覆盖容器中的值,最后return 容器中的值。
      

  7.   

    应该是return之前检查到有finally所以执行了finally的代码
      

  8.   

    finally中的语句永远执行,当try或者catch中遇到return,throw等结束语句时,先执行finally中语句,执行完毕在返回try,catch中执行结束语句。当然如果finally中遇到return或者throw时,则直接结束,将不会执行try中的结束语句了。楼主最好自己debug一个程序,就知道执行顺序了
      

  9.   

    finally代码块里肯定会执行!!!
    如果里面有return语句会覆盖掉前面的返回值,而且如果前面语句抛出了的异常也会别覆盖!!!
      

  10.   

    不管怎么return最后finally一定会被执行
      

  11.   

    不知有没有误解你的说法,我写了下面的代码,发现,是先执行try里面的代码,即使碰到return语句,再执行finally里面的代码。如果try和finally都有return的话,是执行finally里的retrun语句。代码如下public class FinallyTest { static int test() {
    try {
    System.out.println("try");
    return print(1);
    } finally {
    System.out.println("finally");
    return print(2);
    }
    } static int print(int i) {
    System.out.println("print:" + i);
    return i;
    }
    public static void main(String[] args) {
    int i = test();
    System.out.println(i);
    }
    }
      

  12.   

    网址挂啦。。我懂,我问的是执行顺序的问题
    嗯,我试试你这个是从哪里看的?看起来有点道理,想确认一下是不是权威说法
    其实像这些说法没有什么权威不权威的,很简单,还是那句话,自己写个简单程序debug一下是最好的,比别人说10句都管用,而且还记忆深刻。
      

  13.   

    其实try
    public class Test1 {
    public  static void main(String[] arg) throws Exception{
    System.out.println(test());
    }static int test(){
    int i = 0;
        try {
            System.out.println("try");
            return ++i;
        } finally{
            System.out.println("finally");
            return ++i;
        }
    }
    }
    从这个代码的结果是2和lz的static int test(){
            try {
                System.out.println("try");
                return 1;
            } finally{
                System.out.println("finally");
                return 2;
            }
    }可以看出try中return无论如何都先于finally执行,只是没最后return的是finally里的
      

  14.   

    我记得finally中的代码只有一种情况下不会执行,就是try里面有System.exit(0);