日期:2014-05-20  浏览次数:20697 次

Java面试问题之五
详细分析以下代码段,给出执行结果及其原因。
public class WithReturn{
  public int methodA(int money) throws SpecialException{
       if(--money<=0)
            throw new SpecialException("Out of money!!");
       return money;
  }

  public int methodB(int money){
      try{
          System.out.println("Begin");
          int result=methodA(money);    //此处可能抛出异常
          return result;
      }catch(SpecialException e){
          System.out.println(e.getMessage());
          return -100;
      }finally{
             System.out.println("Finally");
      }
  }

  public static void main(String[] args){
       System.out.println(new WithReturn().methodB(1));
  }
}




问题分析:由于return语句用于退出方法。在执行try或者catch语句中使用return语句,如果最后还有finally代码块,则程序会首先finally代码块中的语句,然后在执行返回语句。

所以,上面代码段的结果是:
Begin
Out of money
Finally
-100


但是,值得注意的一点就是,企图在finally代码块中修改返回语句返回的值是不行的。也就是说,finally代码块不能通过重新给变量赋值的方式来改变return语句的返回值。

例如,以下代码执行后的结果是0而不是1。
public static int test(){
     int a=0;
     try{
         return a;
     }finally{
         a=1;
     }
}


public static void main(String[] args) throws Exception{
      System.out.println(test());
}



另外,尽量避免在finally中使用return语句,因为它具有两种风险。第一,会覆盖掉try/catch代码块中的return语句返回的值。第二就是,有可能会丢失异常。所以不要在finally代码块中使用return语句是一个良好的编程习惯,一定要谨记!