抽时间整理了下java中异常与return,以前这块总是弄混淆,觉得还是写下来慢慢整理比较好。由于水平有限,仅供参考。废话不多说,直接上代码。
下面是两个方法:
throwReturn(){ 2int ret = 0; 3try{ 4ret = 10/0 ; 5ret++; 6return ret; 7}catch(Exception e){ 8System.out.println(“catch block ” + e.getMessage()); ret;11}finally{12System.out.println(“finally block invoked!!!”);13ret++;14System.out.println(“finally block invoked, ret is ” + ret);15 }
finallyReturn(){ 2int ret = 0; 3try{ 4ret = 10/0 ; 5ret++; 6return ret; 7}catch(Exception e){ 8System.out.println(“catch block ” + e.getMessage()); ret;11}finally{12System.out.println(“finally block invoked!!!”);13ret++;14System.out.println(“finally block invoked, ret is ” + ret);15return ret;16 }1718}
然后在主方法中分别调用两个方法:
main(String args[]){2 System.out.println(“throwReturn:” + throwReturn());}
第一个方法输出结果:
catch block / by zerofinally block invoked!!!finally block invoked, ret is 1throwReturn:0
throwRetrun方法返回的结果并不是我预想的1,而是0。
个人分析:
第二个方法的输出结果:
catch block / by zerofinally block invoked!!!finally block invoked, ret is 1finallyReturn:1
哎,这次的输出结果是1了。
仔细比较两个方法发现第二个方法,在finally语句中多了一个return ret;程序的执行过程同上面基本上是一样的,只是在最终执行finally代码块是碰到了return语句,此时程序就直接将ret的值返回了,而此时ret的值是1,最后输出:finallyReturn:1
接下来我们再看2个方法:
throwException() throws Exception{ 2int ret = 0; 3try{ 4ret = 10/0 ; 5System.out.println(“ret:” + ret); 6return ret; 7}catch(Exception e){ 8System.out.println(“catch block ” + e.getMessage()); 9throw e;10}finally{11System.out.println(“finally block invoked!!!”);12ret++;13System.out.println(“finally block invoked, ret is ” + ret);14 }1516}
finallyThrowException() throws Exception{ 2int ret = 0; 3try{ 4ret = 10/0 ; 5System.out.println(“ret:” + ret); 6return ret; 7}catch(Exception e){ 8System.out.println(“catch block ” + e.getMessage()); 9throw e;10}finally{11System.out.println(“finally block invoked!!!”);12ret++;13System.out.println(“finally block invoked, ret is ” + ret);14return ret;15 }1617}
然后在主方法中分别调用两个上面方法:
main(String args[]){ 2try { 3System.out.println(“throwException:” + throwException()); 4} catch (Exception e) { 5System.out.println(“捕获到throwException方法抛出的异常,” + e.getMessage()); 6 } try { 9 System.out.println(“finallyThrowException:” + finallyThrowException());10 } catch (Exception e) {11 System.out.println(“捕获到finallyThrowException方法抛出的异常,” + e.getMessage());}
第一个方法输出结果:
catch block / by zerofinally block invoked!!!finally block invoked, ret is 1捕获到throwException方法抛出的异常,/ by zero
个人分析:
第二个方法的输出结果:
catch block / by zerofinally block invoked!!!finally block invoked, ret is 1finallyThrowException:1
观察输出结果会发现,主方法并没有捕获到finallyThrowException方法调用时的异常(catch块的打印没有执行)。
这两个方法的主要区别也是在于:在finallyThrowException方法的finally块中多出了return ret语句。调用finallyThrowException方法的执行过程同调用throwException方法基本一致。
从finallyThrowException方法执行结果可以看出方法执行时的异常被丢失了
最后再来看一个小例子
人,也总是很难发现自己的错误,