Java异常捕获之try-catch-finally-return的执行顺序

本文详细解析了Java中try、catch、finally块内return语句的执行顺序与异常处理流程,包括不同情况下变量的最终返回值。

情况1:try块中没有抛出异常try和finally块中都有return语句

 public static int NoException(){
  int i=10;
  try{
   System.out.println("i in try block is"+i);
   return --i;
  }catch(Exception e){
   --i;
   System.out.println("i in catch - form try block is"+i);
   return --i;
  }finally{
   
   System.out.println("i in finally - from try or catch block is"+i);
   return --i;
  }
 }


执行结果:

i in try block is10
i in finally - from try or catch block is9
the method value is8

执行顺序:执行try块,执行到return语句时,先执行return的语句,--i,但是不返回到main 方法,执行finally块,遇到finally块中的return语句,执行--i,并将值返回到main方法,这里就不会再回去返回try块中计算得到的值

 

情况2:try块中没有抛出异常,仅try中有return语句

代码:

	public static int NoException(){
		int i=10;
		try{
			System.out.println("i in try block is--"+i);
			return --i;
		}catch(Exception e){
			--i;
			System.out.println("i in catch - form try block is--"+i);
			return --i;
		}finally{
			
			System.out.println("i in finally - from try or catch block is--"+i);
			--i;
			System.out.println("i in finally block is--"+i);
			//return --i;
		}
	}


执行结果:

i in try block is--10
i in finally - from try or catch block is--9
i in finally block is--8
the method value is--9

顺序:try中执行完return的语句后,不返回,执行finally块,finally块执行结束后,返回到try块中,返回i在try块中最后的值

 

情况3:try块中抛出异常try,catch,finally中都有return语句

代码:

	public static int WithException(){
		int i=10;
		try{
			System.out.println("i in try block is--"+i);
			i = i/0;
			return --i;
		}catch(Exception e){
			System.out.println("i in catch - form try block is--"+i);
			--i;
			System.out.println("i in catch block is--"+i);
			return --i;
		}finally{
			
			System.out.println("i in finally - from try or catch block is--"+i);
			--i;
			System.out.println("i in finally block is--"+i);
			return --i;
		}
	}


执行结果:

i in try block is--10
i in catch - form try block is--10
i in catch block is--9
i in finally - from try or catch block is--8
i in finally block is--7
the method value is--6

顺序,抛出异常后,执行catch块,在catch块的return的--i执行完后,并不直接返回而是执行finally,因finally中有return语句,所以,执行,返回结果6

 

情况4,catch中有return,finally中没有,同上,执行完finally语句后,依旧返回catch中的执行return语句后的值,而不是finally中修改的值

情况5:try和catch中都有异常,finally中无return语句

	public static int CatchException(){
		int i=10;
		try{
			System.out.println("i in try block is--"+i);
			i=i/0;
			return --i;
		}catch(Exception e){
			System.out.println("i in catch - form try block is--"+i);
			int j = i/0;
			return --i;
		}finally{
			
			System.out.println("i in finally - from try or catch block is--"+i);
			--i;
			System.out.println("i in finally block is--"+i);
			//return --i;
		}
	}


结果:

i in try block is--10
i in catch - form try block is--10
i in finally - from try or catch block is--10
i in finally block is--9
Exception in thread "main" java.lang.ArithmeticException: / by zero
 at exception.ExceptionTest0123.CatchException(ExceptionTest0123.java:29)
 at exception.ExceptionTest0123.main(ExceptionTest0123.java:17)

执行顺序:在try块中出现异常,到catch中,执行到异常,到finally中执行,finally执行结束后判断发现异常,抛出

 

情况6:try,catch中都出现异常,在finally中有返回

	public static int CatchException(){
		int i=10;
		try{
			System.out.println("i in try block is--"+i);
			i=i/0;
			return --i;
		}catch(Exception e){
			System.out.println("i in catch - form try block is--"+i);
			int j = i/0;
			return --i;
		}finally{
			
			System.out.println("i in finally - from try or catch block is--"+i);
			--i;
			System.out.println("i in finally block is--"+i);
			return --i;
		}
	}


运行结果:

i in try block is--10
i in catch - form try block is--10
i in finally - from try or catch block is--10
i in finally block is--9
the method value is--8

执行顺序:try块中出现异常到catch,catch中出现异常到finally,finally中执行到return语句返回,不检查异常

 

没有catch,只有try和finally时,执行顺序和上面的几种情况差不多,只是少了catch块的执行

 

欢迎大家补充指正

 

 

 

### Javatry-catch的用法及异常捕获示例 在Java中,`try-catch`语句块用于捕获和处理程序运行时可能发生的异常。通过将可能抛出异常的代码放在`try`块中,并使用一个或多个`catch`块来捕获特定类型的异常,可以有效地控制程序的执行流程[^2]。 以下是一个完整的`try-catch`使用示例,展示如何捕获并处理异常: ```java public class ExceptionHandlingExample { public static void main(String[] args) { try { // 可能抛出异常的代码 int result = divide(10, 0); // 这会抛出ArithmeticException System.out.println("结果: " + result); } catch (ArithmeticException e) { // 捕获算术异常 System.out.println("捕获到算术异常: " + e.getMessage()); } catch (Exception e) { // 捕获其他所有异常 System.out.println("捕获到未知异常: " + e.getMessage()); } finally { // 无论是否发生异常,都会执行 System.out.println("finally块被执行"); } } // 定义一个可能抛出异常的方法 public static int divide(int a, int b) { return a / b; // 如果b为0,会抛出ArithmeticException } } ``` #### 示例解析 - `try`块包含可能抛出异常的代码。例如,在上述代码中,`divide(10, 0)`会导致`ArithmeticException`。 - `catch`块用于捕获特定类型的异常。每个`catch`块只能捕获一种类型的异常,但可以通过多个`catch`块捕获不同类型的异常[^2]。 - `finally`块中的代码无论是否发生异常都会执行,通常用于释放资源(如关闭文件流或网络连接)[^1]。 ### 异常捕获的注意事项 - **异常类型匹配**:`catch`块会根据异常类型进行匹配。如果`try`块中抛出的异常类型与某个`catch`块的类型一致,则该`catch`块会被执行[^2]。 - **异常顺序**:子类异常应放在父类异常之前,否则可能导致编译错误。例如,`IOException`是`Exception`的子类,因此`catch (IOException e)`应放在`catch (Exception e)`之前[^1]。 - **性能影响**:虽然`try-catch`语句本身不会显著影响性能,但频繁地抛出和捕获异常可能会对程序性能产生一定影响。因此,建议仅在必要时使用异常处理机制[^3]。
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值