java中try、catch、finally语句块和return的执行顺序

java中try、catch、finally语句块的执行顺序

初学到try、catch、finally时我所记得的时:三者的顺序try语句块先执行,执行过程中如果遇到异常则转入catch语句块,最后执行finally语句块的内容。在不牵扯到return语句时这很好记。在加入到return语句时就有很多要注意的情况。
1.try中有return,没有catch,finally中没有return。

public class Test {
	public static void main(String[] args) {
		Test m = new Test();
		System.out.println("return i=" + m.amethod());
	}

	public int amethod() {
		int i = 0;
		try {
			i++;
			System.out.println("try i=" + i + " ");
			return ++i;
		} finally {
			// 2.finally一定会在return之前执行。(准确说,应该是return;语句)
			i++;
			System.out.println("finally i=" + i + " ");
		}
	}
}

执行结果:

try i=1 
finally i=3 
return i=2


这里先执行了try语句,i的值变为1,
然后执行了return语句,++i,i的值变为2,将要返回的值2保存起来, 继续执行finally语句,
在finally开始时i的值为2,执行后变为3
函数执行结束,将临时保存的值2返回。

public static void main(String[] args) {
		Test m = new Test();
		System.out.println("return i=" + m.amethod1());
	}
public int amethod1() {
		int i = 0;
		try {
			// 1,抛出异常,i=1

			i++;
			int x = i / 0;
			System.out.println("try return" + i + " ");
		} catch (Exception ex) {
			// 2.catch捕获异常,并执行
			i++;
			System.out.println("catch return  " + i + " "); 
			//3.执行++i; i变为3
			return ++i;
		} finally {
			// 4.finally一定会在return之前执行。(准确说,应该是return;语句)
			i++;
			System.out.println("finally return " + i + " ");
		}
		return 0;
	}

执行结果:

catch return  2 
finally return 4 
return i=3
public int amethod3() {
		return -1;
	}

	public int amethod2() {
		int i = 0;
		try {
			// 1,抛出异常

			i++;
			int x = i / 0;
			System.out.println("2try return" + i + " ");
		} catch (Exception ex) {
			// 2.catch捕获异常,并执行
			i++;
			System.out.println("2catch return  " + i + " "); 
			//3.执行amethod1();,结果保存下来,等待finally执行完毕之后返回
			return amethod1();
		} finally {
			// 4.finally一定会在return之前执行。(准确说,是函数执行完毕,将返回值返回)
			i++;
			System.out.println("2finally return " + i + " ");
			//5.执行return i, i的值覆盖掉第三步保存下来的值并将i返回
			return i;
		}
	}

执行结果:

2catch return  2 
2finally return 3 
return i=3

总结
在不产生异常的情况下,try语句块执行和catch语句块相似
执行顺序:
1.try/catch语句块(不包含return语句)
2.return语句(执行要返回的语句,得出返回值,并临时保存下来
3.执行final语句,如果没有return语句,执行完成后,函数返回之前保存的结果
如果有return语句,finally语句块的return值将覆盖之前保存的值并返回

### Javatry-catch-finally执行顺序与异常处理机制 在Java中,`try-catch-finally` 是一种用于捕获处理程序运行时异常的结构。其执行顺序异常处理机制如下: #### 1. `try` 块 `try` 块包含可能抛出异常的代码。如果 `try` 块中的代码没有抛出异常,则会正常执行完该块内的所有语句[^1]。 #### 2. 异常抛出与 `catch` 块 如果 `try` 块中的代码抛出了异常,程序会立即停止执行 `try` 块剩余的部分,并跳转到与异常类型匹配的第一个 `catch` 块。如果没有匹配的 `catch` 块,则异常会被传递给调用栈中的上一层方法处理[^2]。 #### 3. `finally` 块 无论是否发生异常,`finally` 块中的代码都会被执行。即使在 `try` 或 `catch` 块中有 `return` 语句,`finally` 块仍然会在方法返回之前执行[^3]。 #### 执行顺序示例 以下代码展示了 `try-catch-finally` 的执行顺序: ```java public class TestTryCatchFinally { public static void main(String[] args) { System.out.println(test("12")); } public static int test(String str) { try { Integer.parseInt(str); // 可能抛出 NumberFormatException return 1; // 如果没有异常,返回1 } catch (NumberFormatException e) { return -1; // 捕获异常并返回-1 } finally { System.out.println("test结束"); // 无论是否有异常,都会执行 } } } ``` 在上述代码中,`finally` 块中的语句总是在 `try` 或 `catch` 块之后执行,即使 `try` 或 `catch` 块中有 `return` 语句[^3]。 #### 异常处理机制 Java中的异常处理基于“抓抛模型”。当程序运行过程中遇到异常时,会生成一个异常对象并将其提交给Java运行时系统。如果当前方法无法处理该异常,则会将异常传递给调用者方法,这一过程称为“抛出”异常。调用者方法可以选择捕获并处理异常,或者继续将异常向上层方法传递,直到异常被处理或导致程序终止。 #### 多重 `catch` 块 可以为同一种类型的异常提供多个 `catch` 块以实现不同的异常分类处理。例如: ```java public class MultiCatchExample { public static void main(String[] args) { try { int[] arr = {1, 2, 3}; System.out.println(arr[10]); // ArrayIndexOutOfBoundsException } catch (ArrayIndexOutOfBoundsException e) { System.out.println("数组越界异常:" + e.getMessage()); } catch (Exception e) { System.out.println("其他异常:" + e.getMessage()); } finally { System.out.println("finally执行"); } } } ``` 在此示例中,程序首先尝试访问数组的第11个元素(索引为10),这将抛出 `ArrayIndexOutOfBoundsException` 异常。由于第一个 `catch` 块能够处理该异常,因此不会进入第二个 `catch` 块[^4]。 ### 注意事项 - 如果 `try` 块中有 `return` 语句,`finally` 块仍会在方法返回之前执行。 - 如果 `try` `catch` 块中都未处理某些异常,则这些异常会传播到调用栈的上层方法。 - `finally` 块通常用于释放资源(如关闭文件、数据库连接等)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值