详细分析以下代码段,给出执行结果及其原因。
问题分析:由于return语句用于退出方法。在执行try或者catch语句中使用return语句,如果最后还有finally代码块,则程序会首先finally代码块中的语句,然后在执行返回语句。
所以,上面代码段的结果是:
Begin
Out of money
Finally
-100
但是,值得注意的一点就是,企图在finally代码块中修改返回语句返回的值是不行的。也就是说,finally代码块不能通过重新给变量赋值的方式来改变return语句的返回值。
例如,以下代码执行后的结果是0而不是1。
另外,尽量避免在finally中使用return语句,因为它具有两种风险。第一,会覆盖掉try/catch代码块中的return语句返回的值。第二就是,有可能会丢失异常。所以不要在finally代码块中使用return语句是一个良好的编程习惯,一定要谨记!
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语句是一个良好的编程习惯,一定要谨记!