先return然后finally,如:
public class myClass{
public static void main(String args[]) {
try{
Integer.parseInt("1");
return;
}catch(Exception e) {}
finally {
  System.out.println("finally");
}
}
}

解决方案 »

  1.   

    都RETURN了还怎么FINALLY啊?我认为先FINALLY然后RETRUN;
      

  2.   

    我觉得未必,上面的代码是说明不了什么问题的,除非把堆栈中位置打印出来看有否帮助。
    但我觉得不管是先return还是先finally,对于你在调用完这个方法后,finally是肯定已经执行了。结果对你而言都是一致的。我用下面的测试用例得出的就是:
    begin...
    finally
    end.public class myTest{
     static String str="";
     public static void main(String args[]) {
       System.out.println("begin...");
       test();
       System.out.println(str);
       System.out.println("end.");
     }
     public static void test(){
       try{
         Integer.parseInt("1");
         str="return";
         return;
       }catch(Exception e) {   }finally {
     str="finally";
       }
     }
    }
      

  3.   

    我同意beyond_xiruo(希偌) 的说法。
    先return 后finally.
    事实就是这样,也应该是这样。
    比如说对数据库的操作,先try,返回数据集,操作完毕后catch异常,然后在finally中关闭数据库的连接,如果先finally,关闭了连接,然后再返回数据集的话,只能返回一个空值,那你的try岂不是白做了。
      

  4.   

    public class MyTest{
        static String str="";
        public static void main(String args[]) {
            System.out.println("begin...");
            
            System.out.println(test());
            System.out.println("end.");
        }
        public static boolean test(){
            boolean result = true;
            try{            
                System.out.println("before return.....");
                return result;          //----->返回的true,finally的确执行了,但并没有修改掉result。
            }catch(Exception e) {
                 return false;                
            }finally {
                System.out.println("in finally.....");
                result = false;            
                // return result;    ----->如果在finally中同样有return,将执行finnaly中的return,忽略try,catch中的return.
            }        
        }
    }
    如果finnaly中没有return,屏幕输出为:
    begin...
    before return.....
    in finally.....
    true
    end.
    如果finnaly中有return,屏幕输出为:
    begin...
    before return.....
    in finally.....
    false
    end.
      

  5.   

    我已经试过了,先finally在return
    import java.io.*;public class a{          
        
         public a(){System.out.println(hello());}
         public boolean hello(){
          try{
             return true;
          }
          finally{
                System.out.println("finally is first!");
          }
         }                                      
         
         public static void main(String[] args){
          a a1 = new a();
         }
    }
    输出:finally is first!
          true
      

  6.   

    yang_yingfeng(爱无价):
    你的程序说明不了任何问题,无论先执行finally或先执行return结果是一样的。
      

  7.   

    sorry,没有说清楚,应该是
    程序从上到下,先运行try代码块,出错时转到catch块,当遇到return语句的时候查找finally代码块,然后运行它,最后return返回
      

  8.   

    总之无论如何,在try或catch块中遇到return语句都会先查找并运行finally块中的代码才返回,除非遇到System.exit(0);
      

  9.   

    总之无论如何,在try或catch块中遇到return语句都会先查找并运行finally块中的代码才返回,除非遇到System.exit(0);
      

  10.   

    To maple92(枫) :
      呵呵,返回结果集是直接用return rs吗?事实上如要返回数据集,并且在该方法中要关闭连接的话,是必须要把结果集读出来,或者用sun提供的一个rowset补丁包才可以做到。To xiao_yuer(小鱼儿):
     完全正确。
     ps:当然不能两次return阿,那会要它听谁的呢。编译的时候就会将try中的return去掉的。
     顺便问一下,是余工吗?呵呵
      

  11.   

    已经很清楚了,先FINALLY,后RETURN;
      

  12.   

    呵呵,肖工眼力不错啊。
    的确只能有一次return.我那段意思就是finnaly中除了System.exit()以外,还有一个return语句会导致try中return语句不执行,不过是不是编译的时候就把try中去掉了,这就不清楚了。但我觉得奇怪的是,finnaly的确应该是先执行(书上云),但为什么我在finnaly中对result进行的修改却不起作用呢?
     try{            
                System.out.println("before return.....");
                return result;    //----->返回的true,finally的确执行了,但并没有修改掉result。
            }catch(Exception e) {
                 return false;                
            }finally {
                System.out.println("in finally.....");
                result = false;    
            }
      

  13.   

    我认为应该这样理解,方法在return时,因为存在finally,所以必须在return之前先执行finally(这里可以把finally当成是一个方法,同时在调用finally方法之前需要先保存环境参数到栈中),接下来,result在finally方法中先被修改为false,finally方法调用完以后,系统会从栈中取回相应的环境参数,恢复调用finally方法之前的情境,所以此时被return回的result仍然为true。呵呵,纯属个人YY我将代码稍稍修改为,你会看到我的解释还是很符合输出的:)
        public static boolean test(){
            boolean result = true;
            try{
                System.out.println("before return...result=" + result);
                return result;          //----->返回的true,finally的确执行了,但并没有修改掉result。
            }catch(Exception e) {
                 return false;
            }finally {
                result = false;
                System.out.println("in finally...result=" + result);
                //return result;    //----->如果在finally中同样有return,将执行finnaly中的return,忽略try,catch中的return.
            }
        }
        
      

  14.   

    To demonstrate that the finally clause always runs, try this program: Comment
    //: c10:FinallyWorks.java
    // The finally clause is always executed.
    import com.bruceeckel.simpletest.*;class ThreeException extends Exception {}public class FinallyWorks {
      static int count = 0;
      public static void main(String[] args) {
        SimpleTest monitor =
          new SimpleTest("FinallyWorks");
        while(true) {
          try {
            // Post-increment is zero first time:
            if(count++ == 0)
              throw new ThreeException();
            System.out.println("No exception");
          } catch(ThreeException e) {
            System.err.println("ThreeException");
          } finally {
            System.err.println("In finally clause");
            if(count == 2) break; // out of "while"
          }
        }
        monitor.expect(new String[] {
          "ThreeException",
          "In finally clause",
          "No exception",
          "In finally clause"
        });
      }
    } ///:~
      

  15.   

    呵呵,你加个System.exit()试试看