详细分析以下代码段,给出执行结果及其原因。
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语句是一个良好的编程习惯,一定要谨记!