今天刷牛客网的笔试题时,发现有一道异常处理的题目不太熟练,需要重新回顾总结,主要讨论try-catch-finally的执行顺序,假设读者已了解最基本的try-catch的写法
finally里面没有return
public class ExceptionReturnTest {
public static void main(String[] args) {
System.out.println(getNumber(0));
System.out.println();
System.out.println(getNumber(1));
System.out.println();
System.out.println(getNumber(2));
System.out.println();
System.out.println(getNumber(3));
}
public static int getNumber(int num) {
try {
int result = 2/ num; // 这里有可能会抛出 ArithmeticException
System.out.println("try");
return result;
} catch (Exception e) {
System.out.println("catch");
return 1111111; // 这里的return语句将会被finally的return覆盖
} finally { // finally 一定会执行
System.out.println("finally block");
}
}
}
运行结果为:
catch
finally block
1111111
try
finally block
2
try
finally block
1
try
finally block
0
可以得出以下结论:
- finally必定执行,且执行在try-catch 的 return之前
- 如果finally中没有retrun语句,try-catch语句可以简单的看作成if-else的执行顺序
- try块中遇到异常的语句后,跳到catch,不会执行该异常语句后面的语句。
finally中带有return
public class ExceptionOrder {
public static void main(String[] args) {
System.out.println(getNumber(0));
System.out.println();
System.out.println(getNumber(1));
System.out.println();
System.out.println(getNumber(2));
System.out.println();
System.out.println(getNumber(3));
}
public static int getNumber(int num) {
try {
int result = 2/ num; // 这里有可能会抛出 ArithmeticException
System.out.println("try");// 如果前面出现异常则直接跳到catch
return result;
} catch (Exception e) {
System.out.println("catch");
return 1111111; // 这里的return语句将会被finally的return覆盖
} finally { // 一定会在return中执行,如果finally使用了retutn或throw语句,将会使trycatch中的return或者throw失效
System.out.print("finally block: ");
if (num == 0) {
return -666;
}
if (num == 1) {
return 2333;
}
// 因此尽量不要在finally中返回变量, 在实际项目中,finally通常是拿来关闭流或数据库资源的
}
}
}
运行结果:
catch
finally block: -666
try
finally block: 2333
try
finally block: 1
try
finally block: 0
可以得出以下结论:
- finally仍是在try-catch的return之前运行,因此finally中有return时,不会执行try-catch的return
总结
- finally必定执行
- 若finally中有return语句,则会覆盖try-catch的return语句;否则try-catch语句可以简单的看作成if-else的执行顺序
- 如果try、catch中有return语句,finally中没有return,那么在finally中修改除包装类型和静态变量、全局变量以外的数据都不会对try、catch中返回的变量有任何的影响(包装类型、静态变量会改变、全局变量)
- 核心思想,如果存在,finally中所有语句将在try-catch的
一般语句之后、return语句之前
执行,如果finally中恰巧有return,那么后面还有return也无济于事了 - finally通常是用来关闭资源的,尽量不要写return语句