最近做题的时候遇到过两次 try-catch 这类的问题,全做错了,好嘛,不愧是我,也是醉了。
下面就那其中一题来好好说道说道 try-catch-finally 的整个执行过程。
package algorithms.com.guan.javajicu;
public class TestDemo{
public static String output = "";
public static void foo(int i){
try{
if (i == 1){
throw new Exception();
}
}
catch (Exception e){
output += "2";
return ;
} finally{
output += "3";
}
output += "4";
}
public static void main(String[] args){
foo(0);
foo(1);
System.out.println(output);
}
}
问这段代码最后输出的是什么?
我们先来看代码吧,代码也很简单,就是main方法里面调用foo方法,而foo方法里面用到了我们今天这篇文章的主角 try-catch-finally 。
首先啊我们要知道 finally{} 中的代码不管你有没有抛出异常都会被执行,因此在运行 foo(0) 时,先判断 i 是否等于1,这里很明显不是,所以不会抛出异常,也就不会执行 catch{} 语句,继续往下走会执行 finally{} 中的代码,这时候 output == “3”。
然后继续往下走,这里要注意一下,执行 finally{} 中的代码后,后面的代码还是会执行的,不是直接就结束当前方法(因为我原来就是这样认为的,当然也有执行 finally{} 中的代码后,后面的代码不会执行的情况,等等我会在下面讲到),执行语句 output += "4"; 这个时候 output == “34”,到此 foo(0) 这行代码执行完毕。
接下来执行 foo(1),首先我们也是先判断i 是否等于1,很明显这里是的,所以会抛出异常,这个时候 cath{} 语句就发挥出了它的作用,捕获到了异常,并且执行语句 output += "2"; 执行完成之后此时 output == "342" 。
然后准备执行 return; 结束foo方法,但因为有 finally{} 中的代码,因此还会继续执行 finally{} 中的代码,也就是会执行语句 output += "3"; 执行完成之后就会退出foo方法(这里就是执行 finally{} 中的代码后,后面的代码不会执行的情况,因为 catch 语句有 return),此时 output == “3423”。
所以最后这段代码的输出为:3423
这里扩展一下,如果在 finally{} 语句的最后一行加上 return; 会怎么样呢?有兴趣的话可以自己去试试看,下面附上答案:
怎么样,是不是和你想的一模一样