异常抛出代码先简介
try { //一些会抛出异常的方法 } catch (Exception e) { // 处理该异常的代码块 } catch (Exception2 e) { // 处理该异常的代码块 }//可以加n个catch (Exception e) {} finally { //最终要执行的代码,比如关闭连接 }
catch的异常的catch应该是从子类到父类的顺序,不懂的点这里看看知乎的解释:“异常屏蔽”现象。
基本就是,先父类的话,会把异常catch完了,就不会捕捉到子类了。
好了进入正题,try catch finally中的return的不同执行情况是怎么样的
情况一:只在异常外return一下
package return1; public class ceshi{ public static int yichang(){ try { System.out.println("执行try"); } catch (Exception e) { System.out.println("执行catch"); } finally { System.out.println("执行finally"); } return 4; } public static void main(String[] args) { System.out.println(yichang()); } }
结果:顺序执行,没有异常不执行catch
执行try 执行finally 4
情况二:加上异常
package return1; public class ceshi{ static int i=0; public static int yichang(){ try { i=1%i; System.out.println("执行try"); } catch (Exception e) { System.out.println("执行catch"); } finally { System.out.println("执行finally"); } return 4; } public static void main(String[] args) { System.out.println(yichang()); } }
执行catch 执行finally 4
i=1%i;换一下位置看看
package return1; public class ceshi{ static int i=0; public static int yichang(){ try { System.out.println("执行try"); i=1%i; } catch (Exception e) { System.out.println("执行catch"); } finally { System.out.println("执行finally"); } return 4; } public static void main(String[] args) { System.out.println(yichang()); } }
执行try 执行catch 执行finally 4
说明有异常情况下try,catch,finally是顺序执行的,但是try里面有异常抛出的情况下,异常后面的代码都不执行。
情况三:然后catch加上return 2;
package return1; public class ceshi{ static int i=0; public static int yichang(){ try { System.out.println("执行try"); i=1%i; } catch (Exception e) { System.out.println("执行catch"); return 2; } finally { System.out.println("执行finally"); } return 4; } public static void main(String[] args) { System.out.println(yichang()); } }
执行try 执行catch 执行finally 2
然后把异常去掉
package return1; public class ceshi{ public static int yichang(){ try { System.out.println("执行try"); } catch (Exception e) { System.out.println("执行catch"); return 2; } finally { System.out.println("执行finally"); } return 4; } public static void main(String[] args) { System.out.println(yichang()); } }
执行try 执行finally 4
只在try{ } catch(){return;} finally{} return;
有异常 执行时会进catch,并且只返回catch内的return
没有异常 执行时不会进catch,所以catch内的代码都不执行,只返回
情况四:try{ return;} catch(){return;} finally{}
无异常情况下
package return1; public class ceshi{ static int i=0; public static int yichang(){ try { System.out.println("执行try"); return 1; } catch (Exception e) { System.out.println("执行catch"); return 2; } finally { System.out.println("执行finally"); } } public static void main(String[] args) { System.out.println(yichang()); } }
执行try 执行finally 1
有异常情况下:
package return1; public class ceshi{ static int i=0; public static int yichang(){ try { System.out.println("执行try"); i=1%i; return 1; } catch (Exception e) { System.out.println("执行catch"); return 2; } finally { System.out.println("执行finally"); } } public static void main(String[] args) { System.out.println(yichang()); } }
执行try 执行catch 执行finally 2
情况四:try{ return;} catch(){return;} finally{}
无异常的 执行try 执行finally catch不执行,所以返回try的return
有异常的 执行try 执行catch 执行finally 最后返回catch的返回值
情况五:try{ return;} catch(){return;} finally{return;}
无异常
package return1; public class ceshi{ static int i=0; public static int yichang(){ try { System.out.println("执行try"); return 1; } catch (Exception e) { System.out.println("执行catch"); return 2; } finally { System.out.println("执行finally"); return 3; } } public static void main(String[] args) { System.out.println(yichang()); } }
执行try 执行finally 3
有异常
package return1; public class ceshi{ static int i=0; public static int yichang(){ try { System.out.println("执行try"); i=1%i; return 1; } catch (Exception e) { System.out.println("执行catch"); return 2; } finally { System.out.println("执行finally"); return 3; } } public static void main(String[] args) { System.out.println(yichang()); } }
执行try 执行catch 执行finally 3
情况五:try{ return;} catch(){return;} finally{return;}
无异常 执行try 执行finally 不执行catch 返回finally的return
有异常 执行try 执行catch 执行finally 返回finally的return
情况六:try{ return;} catch(){} finally{return;}
无异常
package return1; public class ceshi{ static int i=0; public static int yichang(){ try { System.out.println("执行try"); return 1; } catch (Exception e) { System.out.println("执行catch"); } finally { System.out.println("执行finally"); return 3; } } public static void main(String[] args) { System.out.println(yichang()); } }
执行try 执行finally 3
有异常
package return1; public class ceshi{ static int i=0; public static int yichang(){ try { System.out.println("执行try"); i=1%i; return 1; } catch (Exception e) { System.out.println("执行catch"); } finally { System.out.println("执行finally"); return 3; } } public static void main(String[] args) { System.out.println(yichang()); } }
执行try 执行catch 执行finally 3
情况六 try{ return;} catch(){} finally{return;}
无异常 执行try 执行finally 不执行catch 返回finally里面的return
有异常 执行try 执行catch 执行finally 返回finally里面的return
情况七:try{ } catch(){return;} finally{return;}
无异常
package return1; public class ceshi{ static int i=0; public static int yichang(){ try { System.out.println("执行try"); } catch (Exception e) { System.out.println("执行catch"); return 2; } finally { System.out.println("执行finally"); return 3; } } public static void main(String[] args) { System.out.println(yichang()); } }
执行try 执行finally 3
有异常
package return1; public class ceshi{ static int i=0; public static int yichang(){ try { System.out.println("执行try"); i=1%i; } catch (Exception e) { System.out.println("执行catch"); return 2; } finally { System.out.println("执行finally"); return 3; } } public static void main(String[] args) { System.out.println(yichang()); } }
执行try 执行catch 执行finally 3
情况七:try{ } catch(){return;} finally{return;}
无异常 执行try 执行finally 不执行catch 返回finally里面的return
有异常 执行try 执行catch 执行finally 返回finally里面的return
public static int yichang(){ try{return; } //1 catch(){return;} //2 finally{return;} //3 return; //4 }
总结:在方法内,1,2,3如果同时存在任意两个两个return或者只finally里面存在一个return,4则不能存在,
不能同时存在,但是至少存在一个,因为一个方法只有一个返回值
finally 任何情况下必定执行 (下面这个图片是一个博客里面看到的,虽然说的不错,不过我感觉这样写的时候很少,因为这样写就失去了try catch finally程序的意义了,不是正常程序用的方法,所以说正常使用情况下finally一定执行,大家可以思考一下)
先判断是否有异常
无异常,不进catch,所以不考虑catch里面的return,
如果finally有renturn,返回的一定是finally里面的,
如果finally没有return,返回的是try里面的return
有异常,先判断是否有finally,
如果有,一定返回finally的return,
如果没有,最后返回catch的返回值。