try、catch、finally中有return语句时程序的执行顺序

1. try代码块中包含return语句,finally代码块中不包含return语句。

public class Test {
	public static void main(String[] args) {
		System.out.println(test());
	}
	static int test() {
		int x=1;
		try {
			System.out.println("try语句块:"+x);
			return x;
		}catch(Exception e) {
			x++;
			System.out.println("catch: "+x);
		}finally {
			 x++;
			 System.out.println("finally语句块:"+x);
			 
		}
		return x;
	}
}

执行结果:

     因为try中带有return,会先执行return前的代码,然后暂时保存需要return的信息,再执行finally中的代码,最后通过return返回之前保存的信息。但是当return的类型不为基本类型时,结果会是怎样的呢?

public List<Integer> test() {
		List<Integer> list= new ArrayList<Integer>();
		int x=1;
		try {
			list.add(6);
			System.out.println("try语句块:"+list);
			return list;
		}catch(Exception e) {
			list.add(8);
			System.out.println("catch: "+list);
		}finally {
			list.add(9);
			 System.out.println("finally语句块:"+list);
			 
		}
		return list;
	}

运行结果:

看完这个例子,可能会发现问题,刚提到return时会临时保存需要返回的信息,不受finally中的影响,为什么这里会有变化?其实问题出在参数类型上,上一个例子用的是基本类型,这里用的引用类型。list里存的不是变量本身,而是变量的地址,所以当finally通过地址改变了变量,还是会影响方法返回值的。

2. try、catch中带有return。

public int test() {
		int x=1;
		try {
			System.out.println("try语句块:"+x);
			int i=x/0;
		}catch(Exception e) {
			x++;
			System.out.println("catch: "+x);
			return x;
		}finally {
			 x++;
			 System.out.println("finally语句块:"+x);
			 
		}
		return x;
	}

运行结果:

       catch中return与try中一样,会先执行return前的代码,然后暂时保存需要return的信息,再执行finally中的代码,最后再通过return返回之前保存的信息。所以,这里方法返回的值是try、catch中累积计算后的2,而非finally中计算后的3。

3. try、finally代码块中均有return语句

public class Test {
	public static void main(String[] args) {
		System.out.println(test());
	}
	static int test() {
		try {
			int x=1;
			System.out.println("try语句块:"+x);
			return x;
		}finally {
			 int j = 2;
			 System.out.println("finally语句块:"+j);
			 return j;
		}
	}
}

 执行结果:

      如果try代码块和finally代码块里都有return语句,try代码块里的return语句会优先finally代码块里的return语句执行,但不会把返回的结果返回给主函数,而是会把finally代码块里return的结果返回给主函数。 这种写法,编译是可以编译通过的,但是编译器会给予警告。所有不推荐在finally中写return语句,会破坏程序的完整性。而且如果finally出现异常,会导致catch中的异常被覆盖。

 总结:

1. finally中的代码总会被执行。

2. 当try、catch中有return时,也会执行finally。return的时候,要注意返回值的类型,是否受到finally中代码的影响。

3. finally中有return时,会直接在finally中退出,导致try、catch中的return失效。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: try catch finally执行顺序是先执行 try的代码,如果出现异常则跳转到对应的 catch 块,执行 catch的代码,最后无论是否出现异常,都会执行 finally的代码。 ### 回答2: try catch finally 执行顺序是先执行 try 语句的代码,如果没有发生异常则跳过 catch 语句块,直接执行 finally 语句的代码。如果在 try 语句发生了异常,程序会跳出 try 块,然后寻找匹配的 catch 块来处理异常。如果找到了匹配的 catch 块,则执行这个块的代码,并跳过 finally 块。如果没有找到匹配的 catch 块,则异常会传递到上层调用者,直到找到了匹配的 catch 块或程序结束。 无论是否发生异常,finally 语句的代码都会被执行,即使在 trycatchreturn 语句。当异常被抛出,会先执行 finally 块的代码,然后再将异常传递给上层调用者。 总结起来,try 语句的代码首先被执行,如果没有发生异常,则执行 finally 语句的代码;如果发生异常,则先执行 finally 语句的代码,然后执行匹配的 catch 语句的代码,最后再执行 finally 语句的代码。无论是否发生异常,finally 语句的代码都会被执行。 这种执行顺序的设计可以确保在程序执行过程资源的释放和清理操作,即使发生了异常也能够得到处理。 ### 回答3: try catch finally 是一种错误处理机制。在程序执行过程,当发生错误try语句的代码会被执行,如果没有错误发生,catchfinally语句块就不会执行try语句的代码被执行,如果出现异常,程序会立即转到与之对应的catch语句块。catch语句块负责处理异常,并提供对应的异常处理逻辑。在catch语句,可以根据捕获到的异常类型进行相应的处理,例如输出错误信息、记录日志、回滚事务等。 无论是否发生异常,finally语句的代码都会被执行。这意味着,无论try的代码是否成功执行finally语句块里的代码都会被执行到。finally语句块通常用于释放资源、回收内存等操作,在代码确保必须执行的一段逻辑。 try catch finally执行顺序如下: 1. 程序首先执行try语句的代码。 2. 如果try语句的代码没有发生异常,catch语句块将被跳过。 3. 如果try语句的代码发生异常,运行系统会查找与之对应的catch语句块,并执行相应的异常处理逻辑。 4. catch语句执行完毕后,程序会继续执行finally语句的代码。 5. finally语句的代码执行完毕后,程序继续执行try catch finally块之后的代码。 总的来说,try catch finally块的执行顺序是:先执行try语句块,再执行catch语句块(如果有异常发生),最后执行finally语句块。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值