java中异常与return
抽时间整理了下java中异常与return,以前这块总是弄混淆,觉得还是写下来慢慢整理比较好。由于水平有限,仅供参考。废话不多说,直接上代码。
下面是两个方法:
1 public static int throwReturn(){ 2 int ret = 0; 3 try{ 4 ret = 10/0 ; 5 ret++; 6 return ret; 7 }catch(Exception e){ 8 System.out.println("catch block " + e.getMessage()); 9 //ret++; 10 return ret; 11 }finally{ 12 System.out.println("finally block invoked!!!"); 13 ret++; 14 System.out.println("finally block invoked, ret is " + ret); 15 } 16 17 }
1 public static int finallyReturn(){ 2 int ret = 0; 3 try{ 4 ret = 10/0 ; 5 ret++; 6 return ret; 7 }catch(Exception e){ 8 System.out.println("catch block " + e.getMessage()); 9 //ret++; 10 return ret; 11 }finally{ 12 System.out.println("finally block invoked!!!"); 13 ret++; 14 System.out.println("finally block invoked, ret is " + ret); 15 return ret; 16 } 17 18 }
然后在主方法中分别调用两个方法:
1 public static void main(String args[]){ 2 System.out.println("throwReturn:" + throwReturn()); 3 //System.out.println("finallyReturn:" + finallyReturn()); 4 }
第一个方法输出结果:
catch block / by zero finally block invoked!!! finally block invoked, ret is 1 throwReturn:0
throwRetrun方法返回的结果并不是我预想的1,而是0。
个人分析:
- 程序执行到throwReturn方法的第4行时由于除0而出错,程序进入catch块,首先会执行打印输出:catch block / by zero
- 接下来会执行catch块的return ret语句,碰到return语句方法会返回退出,而finally语句又是必须执行的,此时程序会将return的结果值暂存起来,继续执行finally块。
- 进入finally块后会输出:finally block invoked!!! 和finally block invoked, ret is 1
- finally块执行完成后程序会回到return处,并返回当时暂存的值
第二个方法的输出结果:
catch block / by zero finally block invoked!!! finally block invoked, ret is 1 finallyReturn:1
哎,这次的输出结果是1了。
仔细比较两个方法发现第二个方法,在finally语句中多了一个return ret;程序的执行过程同上面基本上是一样的,只是在最终执行finally代码块是碰到了return语句,此时程序就直接将ret的值返回了,而此时ret的值是1,最后输出:finallyReturn:1
接下来我们再看2个方法:
1 public static int throwException() throws Exception{ 2 int ret = 0; 3 try{ 4 ret = 10/0 ; 5 System.out.println("ret:" + ret); 6 return ret; 7 }catch(Exception e){ 8 System.out.println("catch block " + e.getMessage()); 9 throw e; 10 }finally{ 11 System.out.println("finally block invoked!!!"); 12 ret++; 13 System.out.println("finally block invoked, ret is " + ret); 14 } 15 16 }
1 public static int finallyThrowException() throws Exception{ 2 int ret = 0; 3 try{ 4 ret = 10/0 ; 5 System.out.println("ret:" + ret); 6 return ret; 7 }catch(Exception e){ 8 System.out.println("catch block " + e.getMessage()); 9 throw e; 10 }finally{ 11 System.out.println("finally block invoked!!!"); 12 ret++; 13 System.out.println("finally block invoked, ret is " + ret); 14 return ret; 15 } 16 17 }
然后在主方法中分别调用两个上面方法:
1 public static void main(String args[]){ 2 try { 3 System.out.println("throwException:" + throwException()); 4 } catch (Exception e) { 5 System.out.println("捕获到throwException方法抛出的异常," + e.getMessage()); 6 } 7 8 /*try { 9 System.out.println("finallyThrowException:" + finallyThrowException()); 10 } catch (Exception e) { 11 System.out.println("捕获到finallyThrowException方法抛出的异常," + e.getMessage()); 12 }*/ 13 }
第一个方法输出结果:
catch block / by zero finally block invoked!!! finally block invoked, ret is 1 捕获到throwException方法抛出的异常,/ by zero
个人分析:
- 在throwException方法执行到第4行时,因为除0操作抛出异常,程序进入catch块,首先执行打印输出:catch block / by zero
- 接下来会执行catch块的throw e语句,向上抛出异常,而finally语句又是必须执行的,此时程序会先执行finally块。
- 进入finally块后会输出:finally block invoked!!! 和finally block invoked, ret is 1
- finally块执行完成后程序会回到catch块throw处,将捕获的异常向上抛出
- 在main方法中会捕获到throwException方法抛出的异常而进入catch块,所以会输出:捕获到throwException方法抛出的异常,/ by zero
第二个方法的输出结果:
catch block / by zero finally block invoked!!! finally block invoked, ret is 1 finallyThrowException:1
观察输出结果会发现,主方法并没有捕获到finallyThrowException方法调用时的异常(catch块的打印没有执行)。
这两个方法的主要区别也是在于:在finallyThrowException方法的finally块中多出了return ret语句。调用finallyThrowException方法的执行过程同调用throwException方法基本一致。
- 在finallyThrowException方法执行时,因为除0操作抛出异常,程序进入catch块,首先执行打印输出:catch block / by zero
- 接下来会执行catch块的throw e语句,向上抛出异常,而finally语句又是必须执行的,此时程序会先执行finally块。
- 进入finally块后会输出:finally block invoked!!! 和finally block invoked, ret is 1
- finally块执行到return ret时,该方法直接返回了ret的值,
- 在main方法中得到finallyThrowException的返回值后输出:finallyThrowException:1
从finallyThrowException方法执行结果可以看出方法执行时的异常被丢失了
最后再来看一个小例子
1 public static void finallyWork(){ 2 int count = 0; 3 while(true){ 4 try{ 5 if(count++ == 0){ 6 throw new Exception("my error"); 7 } 8 System.out.println("invoked ..."); 9 }catch(Exception e){ 10 System.out.println("catched exception:" + e.getMessage()); 11 }finally{ 12 System.out.println("finally block invoked!!!"); 13 if(count == 2){ 14 break; 15 } 16 } 17 } 18 }
这个小例子的主要思路是当java中的异常不允许我们回到异常抛出的地点时,我们可以将try块放到循环里,这样程序就又可以回到异常的抛出点了,可以同时设置一个计数器,当累积尝试一定的次数后程序就退出。
ok,就说这么多了,下面附上完整代码:
package tt;public class FinallyWorks {/*** @param args*/public static void main(String[] args) {//finallyWork();/**<output begin>* catch block / by zero* finally block invoked!!!* finally block invoked, ret is 1* throwReturn:0*</output end>*从输出结果中可以看出程序在int temp = 10/0;这一行抛出异常,直接进入catch块,首先输出打印catch block...,继续往下执行时碰到return语句,由于程序*存在finally语句,在程序返回之前需要执行finally语句。那么此时程序会将return的结果值暂时存起来,继续执行finally,从输出上可以看出finally执行后ret*的值变为了1,而整个方法最终的返回结果是0,说明return的是之前暂存的值。* *///System.out.println("throwReturn:" + throwReturn());/** <output begin>* catch block / by zero* finally block invoked!!!* finally block invoked, ret is 1* finallyReturn:1*</output end>*从输出结果中可以看出程序在int temp = 10/0;这一行抛出异常,直接进入catch块,首先输出打印catch block...,继续往下执行时碰到return语句,由于程序*存在finally语句,在程序返回之前需要执行finally语句。那么此时程序会将return的结果值暂时存起来,继续执行finally,从输出上可以看出finally执行后ret*的值变为了1,有在finally块中碰到了return语句,方法就直接返回了,所以方法结果返回了1。* *///System.out.println("finallyReturn:" + finallyReturn());/**<output begin>* catch block / by zero* finally block invoked!!!* finally block invoked, ret is 1* 捕获到throwException方法抛出的异常,/ by zero*</output end>*从输出结果中可以看出在调用throwException方法是出现异常,程序进入该方法的catch块中,输出:catch block / by zero*由于存在finally,程序会先执行完finally语句输出:finally block invoked!!! 和 finally block invoked, ret is 1*然后将捕获到的异常抛向上层。上层的main方法catch到这个异常之后会输出:捕获到throwException方法抛出的异常,/ by zero*《注意throwException:那句打印是不会输出的》* *//*try {System.out.println("throwException:" + throwException());} catch (Exception e) {System.out.println("捕获到throwException方法抛出的异常," + e.getMessage());}*//**<output begin>* catch block / by zero* finally block invoked!!!* finally block invoked, ret is 1* finallyThrowException:1*</output end>*从输出结果中可以看出在调用finallyThrowException方法是出现异常,程序进入该方法的catch块中,输出:catch block / by zero*由于存在finally,程序会先执行完finally语句输出:finally block invoked!!! 和 finally block invoked, ret is 1*之后程序执行到finally块中return语句,直接返回了ret的值,主方法接受到这个返回值后输出:finallyThrowException:1*《注意主方法中catch块代码并没有被执行,这就说明了finallyThrowException方法中异常被丢失了》* */try {System.out.println("finallyThrowException:" + finallyThrowException());} catch (Exception e) {System.out.println("捕获到finallyThrowException方法抛出的异常," + e.getMessage());}}public static int throwException() throws Exception{int ret = 0;try{ret = 10/0 ;System.out.println("ret:" + ret);return ret;}catch(Exception e){System.out.println("catch block " + e.getMessage());throw e;}finally{System.out.println("finally block invoked!!!");ret++;System.out.println("finally block invoked, ret is " + ret);}}public static int finallyThrowException() throws Exception{int ret = 0;try{ret = 10/0 ;System.out.println("ret:" + ret);return ret;}catch(Exception e){System.out.println("catch block " + e.getMessage());throw e;}finally{System.out.println("finally block invoked!!!");ret++;System.out.println("finally block invoked, ret is " + ret);return ret;}}public static int throwReturn(){int ret = 0;try{ret = 10/0 ;ret++;return ret;}catch(Exception e){System.out.println("catch block " + e.getMessage());//ret++;return ret;}finally{System.out.println("finally block invoked!!!");ret++;System.out.println("finally block invoked, ret is " + ret);}}public static int finallyReturn(){int ret = 0;try{ret = 10/0 ;ret++;return ret;}catch(Exception e){System.out.println("catch block " + e.getMessage());//ret++;return ret;}finally{System.out.println("finally block invoked!!!");ret++;System.out.println("finally block invoked, ret is " + ret);return ret;}}/*** 当java中的异常不允许我们回到异常抛出的地点时,我们可以将try块放到循环里,* 这样程序就又可以回到异常的抛出点了,可以同时设置一个计数器,* 当累积尝试一定的次数后程序就退出。*/public static void finallyWork(){int count = 0;while(true){try{if(count++ == 0){throw new Exception("my error");}System.out.println("invoked ...");}catch(Exception e){System.out.println("catched exception:" + e.getMessage()); }finally{System.out.println("finally block invoked!!!");if(count == 2){break;}}}}}
转载于:https://www.cnblogs.com/pengkw/archive/2012/11/22/2783342.html
java中异常与return相关推荐
- 可惜Java中没有yield return
项目中一个消息推送需求,推送的用户数几百万,用户清单很简单就是一个txt文件,是由hadoop计算出来的.格式大概如下: uid caller 123456 12345678901 789101 12 ...
- 大数据——Java中异常的捕获和处理
Java中异常的捕获和处理 异常的概述 认识异常 Java异常体系结构 Java异常处理机制 异常处理 使用try-catch处理异常 使用try-catch-finally处理异常 使用多重catc ...
- java中异常抛出后代码还会继续执行吗
java中异常抛出后代码还会继续执行吗 参考文章: (1)java中异常抛出后代码还会继续执行吗 (2)https://www.cnblogs.com/xiaoshen666/p/10848827.h ...
- java 错误码设计_关于Java中异常的设计
Java中异常分为checked 和 unchecked 两种. 首先, 什么时候使用checked,什么时候用unchecked? checked本意是要求调用方处理这个异常, unchecked ...
- java抛出数组格式异常,Java中异常
一.异常的概述 在Java中,把异常信息封装成了一个类.当出现了问题时,就会创建异常类对象并抛出异常相关的信息(如异常出现的位置.原因等). 二.异常的继承体系和错误的区别 1.异常的继承体系 Thr ...
- Java中finally和return执行顺序
思考一个问题 Java异常捕获机制try-catch-finally块中的finally语句是否一定会被执行?起码在以下两种情况下是不会被执行的: 1.在try之前就返回了,try没有执行到. 2.t ...
- JAVA产生异常并打印,Java中异常打印输出的常见方法整理
前言 Java异常是在Java应用中的警报器,在出现异常的情况下,可以帮助我们程序猿们快速定位问题的类型以及位置.但是一般在我们的项目中,由于经验阅历等多方面的原因,依然有若干的童鞋在代码中没有正确的 ...
- java中异常和集合
1. java中处理错误情况有两种,1 Error,2 Exception error是无法处理的,Exception是可以处理的情况. Exception中又有两种情况,RuntimeExcep ...
- java中finally和return的执行顺序
注意:return的位置... 从这几个例子中可以看到,如果try之前没有有条件的return,则try..catch..finally语句块中的语句都是顺序执行(如果try中或者catch中 有re ...
最新文章
- 在网络推广外包中企业网站排名优化在网络推广外包中如何实现?
- golang的makefile编写
- getopt的用法与optarg
- 程序员必知的8大排序(二)-------简单选择排序,堆排序(java实现)
- ie兼容响应式布局的实现总结 和 针对ie浏览器的CSS
- 【lucene】lucene 高级搜索
- python入门——P50模块:模块就是程序
- HMM一文搞懂HMM(隐马尔可夫模型)
- 《HBase企业应用开发实战》—— 3.6 本章小结
- FLEX 24节气算法
- XLSTransformer生成excel文件简单示例
- 基于php工程项目管理系统
- 关于盒子背景图片布局
- 常用的音频处理库介绍
- jquery ZeroClipboard实现黏贴板功能,兼容所有浏览器
- 微信公众号展示页面模板
- win10系统下,KMSpico安装过程中出现“无法完成操作,因为文件包含病毒或潜在的垃圾软件”
- Packet(信息包)
- 从云计算六大技术趋势,看亚马逊云科技的领先优势
- python程序创建词云 中国地图_Python基于wordcloud及jieba实现中国地图词云图
热门文章
- 做形态学方法的团队_图像分割实战-分水岭分割方法和GrabCut 算法
- 神经网络的激活函数、并通过python实现激活函数
- 矩阵论复习-过渡矩阵、生成子空间、表示矩阵、度量矩阵、酉空间、内积
- 监督学习和无监督学习_机器学习的要素是什么? 有监督学习和无监督学习两大类...
- ajax异步加载和cmd,异步传输Ajax(JQ)
- 填充table_Excel Power Query | 向下填充的逆过程
- 云联惠身份认证得多久_【转发扩散】你完成认证了吗?老来网APP也可以刷脸认证哦!...
- 树莓派 小屏幕_树莓派学习手动积累(1)
- php 图片不让下载,php简单实现文件或图片强制下载的方法
- 【OpenCV 例程200篇】67. 空间域图像增强的综合应用