2020年9月4日 try catch finally遇见return的时候返回值是啥?(面试题)
package com.atguigu.test04; /* * finally与return混用: * * (1)不管try中是否发生异常,也不管catch是否可以捕获异常,也无论try或catch中是否有return。 * finally中的代码都必须执行 * (2)如果finally中有return,就从finally块的的return回去。 */ public class TestFinallyReturn { public static void main(String[] args) { String str = getNum(1); System.out.println(str); } public static String getNum(int a){ try{ System.out.println(a/0); if(a > 0){ return "正数"; }else if(a < 0){ return "负数"; }else{ return "零"; } }catch(Exception e){ return "异常"; }finally{ return "最终"; } } }
//运行结果:
最终
package com.atguigu.test04; /* * finally与return混用: * * (1)不管try中是否发生异常,也不管catch是否可以捕获异常,也无论try或catch中是否有return。 * finally中的代码都必须执行 * (2)如果finally中有return,就从finally块的的return回去。 * (3)如果finally中没有return,那么先把try或catch中该执行的执行完, * 在return结束当前方法之前,先走一下finally,然后回去结束当前方法 */ public class TestFinallyNoReturn { public static void main(String[] args) { String str = getNum(1); System.out.println(str); } public static String getNum(int a){ try{ System.out.println(a/0); if(a > 0){ return "正数"; }else if(a < 0){ return "负数"; }else{ return "零"; } }catch(Exception e){ System.out.println("exception");//①try、catch中该执行的执行完 return "异常";//③最后return }finally{ System.out.println("finally");//②除了try、catch中该执行的执行完后,先执行finally } } }
//运行结果:
exception
finally
异常
package com.atguigu.test04; /* * finally与return混用: * * (1)不管try中是否发生异常,也不管catch是否可以捕获异常,也无论try或catch中是否有return。 * finally中的代码都必须执行 * (2)如果finally中有return,就从finally块的的return回去。 * (3)如果finally中没有return,那么先把try或catch中该执行的执行完(包括把返回值的结果放到要带回调用处的操作数栈的位置) * 在return结束当前方法之前,先走一下finally,然后回去结束当前方法. * 结论,如果finally中没有return,finally中的代码不影响返回值。 */ public class TestFinallyNoReturn2 { public static void main(String[] args) { int num = getNum(4); System.out.println(num);//0 } public static int getNum(int a){ int result = 10; try{ System.out.println(a/0); if(a > 0){ result = 20; return result; }else if(a < 0){ result = -20; return result; }else{ return result; } }catch(Exception e){ System.out.println("exception"); result = 0; return result; }finally{ result = 30; System.out.println("finally"); // return result;//如果有这句,结果就变成30 } } }
运行结果:
exception//该执行的执行完
finally//除了try、catch之外先执行finally
0//返回值的结果0,(包括把返回值的结果放到要带回调用处的操作数栈的位置)