如果Try和Catch中存在return语句的时候Finally内的语句是否会执行,执行的时候对结果又有什么影响呢?我写了个例子来试验这个问题:
public static Map<String, String> getMapTry() { Map<String, String> map = new HashMap<String, String>(); map.put("KEY", "INIT"); try { map.put("KEY", "TRY"); return map; } catch (Exception e) { map.put("KEY", "CATCH"); e.printStackTrace(); } finally { map.put("KEY", "FINALLY"); } System.out.println("---------end--------"); return map; } public static Map<String, String> getMapCatch() { Map<String, String> map = null; try { map.put("KEY", "TRY"); } catch (Exception e) { map = new HashMap<>(); map.put("KEY", "CATCH"); e.printStackTrace(); return map; } finally { map.put("KEY", "FINALLY"); } System.out.println("---------end--------"); return map; } public static int getInt() { Map<String, String> map = null; int ret =0; try { map.put("KEY", "TRY"); ret = 1; } catch (Exception e) { map = new HashMap<>(); map.put("KEY", "CATCH"); e.printStackTrace(); return ret; } finally { map.put("KEY", "FINALLY"); ret =3; } System.out.println("---------end--------"); return ret; } public static void main(String[] args) { System.out.println("try:" + getMapTry().get("KEY").toString()); System.out.println("catch:" + getMapCatch().get("KEY").toString()); System.out.println("int:" + getInt()); }
执行结果:
try:FINALLY
java.lang.NullPointerException
at com.wmshua.test.FinallyReturnRelation.getMapCatch(FinallyReturnRelation.java:43)
at com.wmshua.test.FinallyReturnRelation.main(FinallyReturnRelation.java:14)
catch:FINALLY
java.lang.NullPointerException
at com.wmshua.test.FinallyReturnRelation.getInt(FinallyReturnRelation.java:63)
at com.wmshua.test.FinallyReturnRelation.main(FinallyReturnRelation.java:15)
int:0
结果分析:
引用类型发生了变化,基本数据类型没有修改。
从执行结果得出以下结论:
- finally 即使在try或者catch中存在 return 且执行的情况下也会执行。
- finally 对变量的修改发生在方法调用结束之前。
- return 语句是在 finally 之前执行的。
- return 的返回结果并不是返回原数据而是对原有数据的拷贝,基本数据类型拷贝基本类型值,引用类型拷贝引用而不拷贝引用内的值。
- finally 内语句能够影响引用类型但不会影响基本数据类型。
时间: 2024-10-27 13:23:17