当前位置: 代码迷 >> 综合 >> 关于try-catch、throw、finally在异常时的执行顺序
  详细解决方案

关于try-catch、throw、finally在异常时的执行顺序

热度:49   发布时间:2023-12-08 03:58:56.0
package test;
//jdk 1.8
public class TestException1 {/*** catch中的return和throw是不能共存的(无论谁先谁后都编译不通过)* 如果只throw e,则必须try-catch捕捉异常e或用throws抛出异常e* 如果只return ,则在catch段正常返回值*/int testEx0(){boolean ret = true;try {int c = 12 / 0;System.out.println("testEx,successfully");return 0;} catch (Exception e) {System.out.println("testEx, catch exception");ret = false;return -1;throw e;}}/*** 在finally中的return和throw是不能共存的(无论谁先谁后都编译不通过)* 如果只throw e,则必须try-catch捕捉异常e或用throws抛出异常e* 如果只return ,则在catch段正常返回值*/int testEx00(){int  ret = 0;try {int c = 12 / 0;System.out.println("testEx,successfully");return ret;} catch (Exception e) {System.out.println("testEx, catch exception");ret = -1;}finally{ret = 1;System.out.println("testEx, finally; return value=" + ret);throw e;return ret;}}/*** 结果:testEx, catch exceptiontestEx, finally; return value=falsefalse结论:在finally里没有return的时候:先执行finally的语句,再执行catch的return*/boolean testEx01(){boolean ret = true;try {int c = 12 / 0;System.out.println("testEx,successfully");return true;} catch (Exception e) {System.out.println("testEx, catch exception");ret = false;return ret;}finally{System.out.println("testEx, finally; return value=" + ret);}}/*** 	结果:* 	testEx, catch exceptiontestEx, finally; return value=11结论:在finally里有return的时候:先执行finally的语句和return,忽略catch的return*/int testEx02(){int ret = 0;try {int c = 12 / 0;System.out.println("testEx,successfully");return ret;} catch (Exception e) {ret = -1;System.out.println("testEx, catch exception");return ret;}finally{ret = 1;System.out.println("testEx, finally; return value=" + ret);return ret;}}/*** 编译能通过,* 但运行时抛异常(当然也没有返回值)* @return*/boolean testEx03(){boolean ret = true;try {int c = 12 / 0;System.out.println("testEx,successfully");return true;} catch (Exception e) {System.out.println("testEx, catch exception");ret = false;throw e;}finally{System.out.println("testEx, finally; return value=" + ret);}}/*** 编译不能通过(必须加throws主动抛异常,或try-catch捕捉,)* 但运行时抛异常(当然也没有返回值)* @return* @throws Exception */boolean testEx031(){boolean ret = true;try {int c = 12 / 0;System.out.println("testEx,successfully");return true;} catch (Exception e) {System.out.println("testEx, catch exception");ret = false;throw new Exception(e);}finally{System.out.println("testEx, finally; return value=" + ret);}}/*** 结果:* 	testEx, catch exceptiontestEx, finally; return value=11 结论:函数在finally里正常返回return的值,无异常,显然catch中的throw被忽略*/int testEx04(){int ret = 0;try {int c = 12 / 0;System.out.println("testEx,successfully");return ret;} catch (Exception e) {System.out.println("testEx, catch exception");ret = -1;throw e;}finally{ret = 1;System.out.println("testEx, finally; return value=" + ret);return ret;}}public static void main(String[] args) {try {System.out.println(new TestException1().testEx0());//System.out.println(new TestException1().testEx00());//System.out.println(new TestException1().testEx01());//System.out.println(new TestException1().testEx02());//System.out.println(new TestException1().testEx03());//System.out.println(new TestException1().testEx031());//System.out.println(new TestException1().testEx04());} catch (Exception e) {e.printStackTrace();}}}