try与finally块中return的问题

本文详细解析了Java中try-catch-finally语句块的不同组合形式及其执行流程,包括return语句的位置对执行过程的影响。并通过具体示例阐述了finally块内return语句的特殊行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

针对以下情况进行测试:

情况1:try{} catch(){} finally{} return;
情况2:try{ return; } catch(){} finally{} return;
情况3:try{} catch(){ return;} finally{} return;
情况4:try{ return; } catch(){} finally{return;}
情况5:try{} catch(){return;} finally{return;}
情况6:try{ return;} catch(){return;} finally{return;}

 

情况1:try{} catch(){} finally{} return;

package com.lwf.eus.servlet;

public class Test {
 public static void main(String[] args) {
  System.out.print(tt());
 }

 public static int tt() {
  int b = 23;
  try {
   System.out.println("yes");
   b += 88;
  } catch (Exception e) {
   System.out.println("error:" + e);
  } finally {
   if (b > 25) {
    System.out.println("b>25:" + b);
   }
   System.out.println("finally");
  }

  return 101;// ---4
 }
}

显然程序按顺序执行,最后return 101退出
结果:

yes
b>25:111
finally
101

 

情况2:try{ return; } catch(){} finally{} return;

package com.lwf.eus.servlet;

public class Test {
 public static void main(String[] args) {
  System.out.print(tt());
 }

 public static int tt() {
  int b = 23;
  try {
   System.out.println("yes");
   return b += 88;//---1
  } catch (Exception e) {
   System.out.println("error:" + e);
  } finally {
   if (b > 25) {
    System.out.println("b>25:" + b);
   }
   System.out.println("finally");
  }

  return 101;// ---4
 }
}
程序执行try块中return之前的代码,并执行return语句中的表达式运算;之后再执行finally块,最后执行try中return;  finally块之后的语句---4处的return,因已在1处return而中断,不再执行。

结果:

yes
b>25:111
finally
111

 

情况3:try{ } catch(){ return;} finally{} return;

package com.lwf.eus.servlet;

public class Test {
 public static void main(String[] args) {
  System.out.print(tt());
 }

 public static int tt() {
  int b = 23;
  try {
   System.out.println("yes");
   b += 88;//---1
  } catch (Exception e) {
   System.out.println("error:" + e);
   return b;//---2
  } finally {
   if (b > 25) {
    System.out.println("b>25:" + b);
   }
   System.out.println("finally");
  }

  return 101;// ---4
 }
}

程序先执行try,如果遇到异常执行catch块,
有异常:则执行catch中return之前(包括return语句中的表达式运算)代码,再执行finally语句中全部代码,最后执行catch块中return. finally之后也就是4处的代码不再执行。
无异常:执行完try再finally再return.
结果:本次为无异常结果(当然本示例没有设计异常)

yes
b>25:111
finally
101

 


情况4:try{ return; } catch(){} finally{return;}

package com.lwf.eus.servlet;

public class Test {
 public static void main(String[] args) {
  System.out.print(tt());
 }

 public static int tt() {
  int b = 23;
  try {
   System.out.println("yes");
   return b += 88;//---1
  } catch (Exception e) {
   System.out.println("error:" + e);
  } finally {
   if (b > 25) {
    System.out.println("b>25:" + b);
   }
   System.out.println("finally");
   return 101;// ---4
  }
  
 }
}
序执行try块中return之前(包括return语句中的表达式运算)代码;再执行finally块,因为finally块中有return所以提前退出
结果:

yes
b>25:111
finally
101

 

情况5:try{} catch(){return;} finally{return;}

package com.lwf.eus.servlet;

public class Test {
 public static void main(String[] args) {
  System.out.print(tt());
 }

 public static int tt() {
  int b = 23;
  try {
   System.out.println("yes");
   b += 88;//---1
   throw new Exception();
  } catch (Exception e) {
   System.out.println("error:" + e);
   return b+=100; // ---2
  } finally {
   if (b > 25) {
    System.out.println("b>25:" + b);
   }
   System.out.println("finally");
   return b;// ---4
  }
  
 }
}

程序执行catch块中return之前(包括return语句中的表达式运算)代码;再执行finally块,因为finally块中有return所以提前退出
结果:

yes
error:java.lang.Exception
b>25:211
finally
211

 

况6:try{ return;} catch(){return;} finally{return;}

有异常且异常发生在try的return之前:程序执行try块中return之前代码(不包括retrun语句中的表达式运算),再执行catch块中return之前(包括return语句中的表达式运算)代码;则再执行finally块,因为finally块中有return所以提前退出

测试代码如下:

package com.lwf.eus.servlet;

public class Test {
 public static void main(String[] args) {
  System.out.print(tt());
 }

 public static int tt() {
  int b = 23;
  try {
   System.out.println("yes");
   b += 88;//---1
   if(b>0){
    throw new Exception();
   }
   return b+=10;
  } catch (Exception e) {
   System.out.println("error:" + e);
   return b+=100; // ---2
  } finally {
   if (b > 25) {
    System.out.println("b>25:" + b);
   }
   System.out.println("finally");
   return b;// ---4
  }
  
 }
}
结果:

yes
error:java.lang.Exception
b>25:211
finally
211

 


有异常且异常发生在try的return语句时:程序执行try块中return之前(包括return语句中的表达式运算)代码,执行catch块中return之前(包括return语句中的表达式运算)代码;则再执行finally块,因为finally块中有return所以提前退出

测试代码如下:

package com.lwf.eus.servlet;

public class Test {
 public static void main(String[] args) {
  System.out.print(tt());
 }

 public static int tt() {
  int b = 23;
  try {
   System.out.println("yes");
   b += 88;//---1
   return 2/0;
  } catch (Exception e) {
   System.out.println("error:" + e);
   return b+=100; // ---2
  } finally {
   if (b > 25) {
    System.out.println("b>25:" + b);
   }
   System.out.println("finally");
   return b;// ---4
  }
  
 }
}
结果:

yes
error:java.lang.ArithmeticException: / by zero
b>25:211
finally
211


无异常:程序执行try块中return之前(包括return语句中的表达式运算)代码,再执行finally块,因为finally块中有return所以提前退出

测试代码如下:

package com.lwf.eus.servlet;

public class Test {
 public static void main(String[] args) {
  System.out.print(tt());
 }

 public static int tt() {
  int b = 23;
  try {
   System.out.println("yes");
   b += 88;//---1
   return 1;
  } catch (Exception e) {
   System.out.println("error:" + e);
   return b+=100; // ---2
  } finally {
   if (b > 25) {
    System.out.println("b>25:" + b);
   }
   System.out.println("finally");
   return b;// ---4
  }
  
 }
}
结果:

yes
b>25:111
finally
111

 

以上几种情况说明:
一、如果try catch finally块均无return则执行最后finally外的return;如果try catch finally中任何一个有return则最后finally外的return不再执行;
二、只要finally块中有return则try或catch中的return不再执行

以下几种情况在finally块的后面是不能出现return的。
情况:try{} catch(){} finally{ return;} return;
情况:try{ return; } catch(){} finally{return;} return;
情况:try{} catch(){return;} finally{return;} return;
情况:try{ return; } catch(){return;} finally{} return;
情况:try{ return; } catch(){return;} finally{return;} return;

上面几种情况因为finally块中已有return,而且是必须执行的,所以finally外的return必定不能执行,所以编译器提示错误。特殊的try{ return; } catch(){return;} finally{} return;是因为try和catch中都有return所以必定会执行其中一个,所以finally外的return不能执行,所以编译器提示错误。


任何调用try 或者catch中的return语句之前,都会先执行finally语句,如果finally存在的话。如果finally中有return语句,那么程序就return了,所以finally中的return是一定会被return的,编译器把finally中的return实现为一个warning。

 有关异常机制参见:深入理解java异常处理机制

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值