finally与return 2020-12-16 22:43 ```java package com.demo; /** * 无论是否有return都会执行finally代码块 * 当try或catch 和 finally代码块 同时有return时,try/catch代码块仅仅会执行业务代码,不会执行“返回” * 全部会替换为执行finally代码块中的返回 * 但是除了返回外的其他业务代码,执行顺序为:try --> catch --> finally * 如果try/cache 和 finally同时存在有return,则执行finally的return返回并退出。 */ public class TestFinally { public static void main(String[] args) { System.out.println(test1(null) + "," + test1("0") + "," + test1("")); // 4,4,4 // 第一个nul会先走到return 1; 然后执行return 4; (有异常被catch到会执行finally) // 第二个"0"会先执行return str.charAt(0) - 48; 然后执行return 4; (无异常会执行finally) // 第三个""会先执行return 2; 然后执行 return 4; (有异常没有被catch到会执行finally) 【异常:StringIndexOutOfBoundsException】 System.out.println(test2(null) + "," + test2("0") + "," + test2("")); // 4,4,4 System.out.println(test3(null) + "," + test3("0") + "," + test3("")); // try // catch null // finally代码块 // try // finally代码块 // try // catch stringindexoutof // finally代码块 // 1,0,2 // 先执行try中的内容,如果有异常,则执行catch中的内容,最后执行finally代码块里的内容。但是catch中的return要在finally中的内容执行后执行 // (这里的return只是返回,不包含业务代码。 // 例如 如果是return fun(1); 那么也会先执行fun(1)然后暂存结果,执行finally代码,然后执行catch中的return 将刚才暂存的结果返回) // 通过查看反编译后的class文件可以看到,如果catch和finally中都有return,那么catch中的return“返回”就会失效,替换为finally中的。 // 仅仅是返回失效,return后若有计算,仍会执行 } public static int test1(String str) { try { return str.charAt(0) - 48; //将字符转为数字,48是'0'的十进制数值 } catch (NullPointerException e1) { return 1; } finally { return 4; } } public static int test2(String str) { try { return str.charAt(0) - 48; //将字符转为数字,48是'0'的十进制数值 } catch (NullPointerException e1) { return 1; } catch (StringIndexOutOfBoundsException e2) { return 2; } catch (Exception e3) { return 3; } finally { return 4; } } public static int test3(String str) { try { System.out.println("try"); return str.charAt(0) - 48; //将字符转为数字,48是'0'的十进制数值 } catch (NullPointerException e1) { System.out.println("catch null"); return 1; } catch (StringIndexOutOfBoundsException e2) { System.out.println("catch stringindexoutof"); return 2; } catch (Exception e3) { return 3; } finally { System.out.println("finally代码块"); } } } ``` 反编译class文件: ```java // // Source code recreated from a .class file by IntelliJ IDEA // (powered by Fernflower decompiler) // package com.demo; public class TestFinally { public TestFinally() { } public static void main(String[] args) { System.out.println(test1((String)null) + "," + test1("0") + "," + test1("")); System.out.println(test2((String)null) + "," + test2("0") + "," + test2("")); System.out.println(test3((String)null) + "," + test3("0") + "," + test3("")); } public static int test1(String str) { try { int var1 = str.charAt(0) - 48; return 4; } catch (NullPointerException var6) { boolean var2 = true; return 4; } finally { ; } } public static int test2(String str) { try { boolean var2; try { int var1 = str.charAt(0) - 48; return 4; } catch (NullPointerException var8) { var2 = true; return 4; } catch (StringIndexOutOfBoundsException var9) { var2 = true; return 4; } catch (Exception var10) { var2 = true; return 4; } } finally { ; } } public static int test3(String str) { byte var2; try { System.out.println("try"); int var1 = str.charAt(0) - 48; return var1; } catch (NullPointerException var8) { System.out.println("catch null"); var2 = 1; return var2; } catch (StringIndexOutOfBoundsException var9) { System.out.println("catch stringindexoutof"); var2 = 2; } catch (Exception var10) { var2 = 3; return var2; } finally { System.out.println("finally代码块"); } return var2; } } ``` --END--
发表评论