try catch finally 执行顺序总结


今天刷牛客网的笔试题时,发现有一道异常处理的题目不太熟练,需要重新回顾总结,主要讨论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

总结

  1. finally必定执行
  2. 若finally中有return语句,则会覆盖try-catch的return语句;否则try-catch语句可以简单的看作成if-else的执行顺序
  3. 如果try、catch中有return语句,finally中没有return,那么在finally中修改除包装类型和静态变量、全局变量以外的数据都不会对try、catch中返回的变量有任何的影响(包装类型、静态变量会改变、全局变量)
  4. 核心思想,如果存在,finally中所有语句将在try-catch的一般语句之后、return语句之前执行,如果finally中恰巧有return,那么后面还有return也无济于事了
  5. finally通常是用来关闭资源的,尽量不要写return语句
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值