先来看牛客上的一道题
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);
}
}
当执行 foo(0)时,首先进入 try 块,不满足,继而进入 finally,最后执行 try-catch-finally 外部的代码,所以 output 变为“34”,然后是 foo(1),进入 try 块,try 中抛出异常,有匹配的 catch 语句,则 catch 语句捕获,然后,因为 catch 中有 return 语句,则 return 要在 finally 执行后再执行;try-catch-finally 之外的代码就不再执行了(因为有 return 打断),所以最终 output 的值为“3423”如果这个例子中的 catch 语句没有 return,那么输出的结果就应该是“34234”. 从此例可以看出亮点:1、try 中没有抛出异常,则 catch 语句不执行,如果有 finally 语句,则接着执行 finally 语句,继而接着执行 finally 之后的语句;2. 不管是否 try…catch,finally 都会被执行。当 try…catch 中有 return 的话,finally 后会执行 try…catch 中的 return,然后不再执行后续语句。也就是说 finally 字句中的语句总会执行,即使有 return 语句,也是在 return 之前执行。3、还有一点:finally 前有 return、finally 块中也有 return,先执行前面的 return,保存下来,再执行 finally 的 return,覆盖之前的结果,并返回。
再一个例子
public class Test
{
public static int aMethod(int i)throws Exception
{
try{
return i / 10;
}
catch (Exception ex)
{
throw new Exception(“exception in a Method”);
} finally{
System.out.printf(“finally”);
}
}
public static void main(String [] args)
{
try
{
aMethod(0);
}
catch (Exception ex)
{
System.out.printf(“exception in main”);
}
System.out.printf(“finished”);
}
}
此题输出结果为 finally finished 如果将 aMethod 中的 i /10 换成 10/i, 则输出结果为 finally exception in main finished