try-catch-finally中return的执行情况
try-catch-finally语句块中,finally语句块是比较特殊的一个,无论异常有没有被触发都会执行该语句块中的语句,如果在try、catch、finally三个语句块都加上return语句,如果不注意就用以搞不清楚,这里简单列举一下try-catch-finally语句的三种情况:
- 三者之中都有return语句,则只执行finally中的return,且finally中的语句是在return之前完成的。
- 若finally中没有return语句,触发了异常就执行catch中的return语句,没有触发就执行try中的语return。但是finally中的语句执行在return之前。
- 若finally语句中发生错误或者异常,则会直接退出程序,自然也执行不到return语句了
考虑以下代码片的执行结果:
public class Test{
public static void main(String[] args){
String p1 = null;
String p2 = "Hello";
System.out.println(test(p1));
System.out.println(test(p2));
}
public static int test(String s){
try{
System.out.println(s.toString());
return 1;
}catch(NullPointerException e){
System.out.println("null");
return 2;
}finally{
System.out.println("lalala");
return 3;
}
}
}
执行结果为
null
lalala
3
Hello
lalala
3
将finally的return语句去除,如下:
public class Test{
public static void main(String[] args){
String p1 = null;
String p2 = "Hello";
System.out.println(test(p1));
System.out.println(test(p2));
}
public static int test(String s){
try{
System.out.println(s.toString());
return 1;
}catch(NullPointerException e){
System.out.println("null");
return 2;
}finally{
System.out.println("lalala");
}
}
}
执行结果为
null
lalala
2
Hello
lalala
1