首先要搞清 try catch 和finally三者的概念,在你的程序中,尤其应该注意finally, finally指的是无论出现异常与否都必须执行的代码,这个是在java中所规定的。 因此在代码中, 必须执行finally中的代码(只有一种情况例外,那就是在try或者catch中强行终止JVM,才不会运行finally中的代码)。有了上面这点认识,再来看你的方案:
在方案1中,因为你的finally中包含了return语句,因此执行到这条语句时,就直接退出方法g,那么这时候就把异常给屏蔽了而在方案2中,因为return语句在try catch finally之外,那么执行完了finally中的语句之后,因为这时候在catch中存在着抛出异常未被捕获的异常,因此方法g抛出异常在方案3中,因为finally中抛出了异常,因此在执行到finally中的异常抛出语句时,方法直接抛出异常退出。异常的处理是很复杂的,如果有兴趣可以看看《effective Java》这本书(书的名字不确定,呵呵)

解决方案 »

  1.   

    你也可以看下面这个例子,看看最后输出多少,这样就更能理解finally的含义了。public class TestException{
        
        static void g(){
            int i = 0;
            try{
                System.out.println(++i);
                throw new Exception();
            }catch(Exception e){
                System.out.println(++i);
                return;  //1
                //System.exit(0); //2
                
            }
            finally{
                System.out.println(++i);
            }
            
           
        }
        
        public static void main(String[] args)throws Exception{
           
            j=g();            
            
            
        }
    }
      

  2.   

    学习..原来在finally中如果有return语句,虽然catch抛出了异常,但方法并没有把异常抛出来,这是第一种情况..
    第二种情况刚是正常途径
      

  3.   

    我是猜的:
    1)将①处注释掉,并去掉②处的注释再试试看,会有什么结果!
    Has Exception:This Exception is in f1()
    2)谁能解释解释方案1为什么不能抛处错误?方案2为什么又能抛出错误呢?
    Java异常处理作用域有关。
    3)去掉finally中/**/注释的部分,抛出哪个异常?
    This Exception is in f2()
      

  4.   

    static int g() throws Exception{
            int i = 0;
            try{
                f1();
            }catch(Exception e){
                i = 1;
                throw e;
            }
            finally{
                i = 2;
                /*
                try{
                    f2();
                }catch(Exception e){
                    throw e;
                }
                */
                return i;//此处为①
            }
            //return i;//此处为②
        }
    Not Exception------------------------------------
       static int g() throws Exception{
            int i = 0;
            try{
                f1();
            }catch(Exception e){
                i = 1;
                throw e;
            }
            finally{
                i = 2;
                
                try{
                    f2();
                }catch(Exception e){
                    throw e;
                }
                
                return i;//此处为①
            }
            //return i;//此处为②
        }This Exception is in f2()
    -------------------------------
      static int g() throws Exception{
            int i = 0;
            try{
                f1();
            }catch(Exception e){
                i = 1;
                throw e;
            }
            finally{
                i = 2;
                /*
                try{
                    f2();
                }catch(Exception e){
                    throw e;
                }
                */
                //return i;//此处为①
            }
            return i;//此处为②
        }This Exception is in f1()
    -------------------------不知道我对不对?
      

  5.   

    to tangqs(leon_tangqs):
    再问个问题,try.catch.finally结构中流程是怎么样的?
    那个简单的来说如果try中出现异常,是先执行完catch块然后再执行finally块呢?如果先执行完catch块,那么执行throw e;的时候,显然要直接退出方法g了,这肯定有问题!
    我认为流程是,先执行完catch的一部分(不包括退出方法的那部分),然后执行finally中的全部,如果finally中有退出方法的部分,就直接退出该方法而忽略catch中退出方法的部分,如果finally中不包括退出方法的部分,就返回到catch中退出方法的部分继续执行(比如说你的程序)。
    不过,JAVA中是怎么实现的呢?catch中退出方法的部分保存再那里?
    另外:你的程序写的也太。实在不应该,要敬业哦!!
      

  6.   

    晕!不知道new Exception什么意思!
      

  7.   

    答案:
    1:Not Exception
       j = 2
    2:Has Exception:This Exception is in f1()
    3:Has Exception:This Exception is in f2()
      

  8.   

    应该这样理解:如果有finally语句,是在执行了catch语句之后、退出方法之前运行finally语句。 当程序运行到catch中throw e时,将不运行catch语句中的其他语句,可是这时候不会退出方法并且要抛出的异常先放在栈中,因为它还要执行finally语句, 正好程序中的finally语句里有一个return语句,因此方法正常退出。我给你的程序是想说明即使在catch语句中出现了return语句,也要先执行完finally语句之后才退出。
    而那条注释的System.exit(0)则是一条强行终止程序执行的语句,当出现这条语句时,才不会运行finally中的语句。
      

  9.   

    我猜 
    1)将①处注释掉,并去掉②处的注释再试试看,会有什么结果!
    Not Exception
    j=2
    2)谁能解释解释方案1为什么不能抛处错误?方案2为什么又能抛出错误呢?
    try catch finally 中不论try catch是否抛出异常或return,最终都要执行finally中的语句的
    3)去掉finally中/**/注释的部分,抛出哪个异常?
    This Exception is in f2()
     tangqs(leon_tangqs) 
    你的例子去掉1处注释应该输出 1 2 3
    去掉2处注释应该输出 1 2
      

  10.   

    finally语句的优先级为什么这么高? 这是因为在finally中一般放置释放资源的语句,释放资源在一个软件中占有很重要的位置,它直接关系到系统的健壮性。
      

  11.   

    tangqs(leon_tangqs) 解释的很好! 很详细。
    佩服佩服。。~
      

  12.   

    D:\sss>javac TestException.java
    TestException.java:27: unreachable statement
            return i;//此处为②
      

  13.   

    果然如tangqs说的 catch中即使抛出异常或者执行返回,都会先执行finally
      

  14.   

    tangqs(leon_tangqs)做事严谨!!值得大家学习