抽时间整理了下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。

个人分析:

  1. 程序执行到throwReturn方法的第4行时由于除0而出错,程序进入catch块,首先会执行打印输出:catch block / by zero
  2. 接下来会执行catch块的return ret语句,碰到return语句方法会返回退出,而finally语句又是必须执行的,此时程序会将return的结果值暂存起来,继续执行finally块。
  3. 进入finally块后会输出:finally block invoked!!! 和finally block invoked, ret is 1
  4. 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

个人分析:

  1. 在throwException方法执行到第4行时,因为除0操作抛出异常,程序进入catch块,首先执行打印输出:catch block / by zero
  2. 接下来会执行catch块的throw e语句,向上抛出异常,而finally语句又是必须执行的,此时程序会先执行finally块。
  3. 进入finally块后会输出:finally block invoked!!! 和finally block invoked, ret is 1
  4. finally块执行完成后程序会回到catch块throw处,将捕获的异常向上抛出
  5. 在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方法基本一致。

  1. 在finallyThrowException方法执行时,因为除0操作抛出异常,程序进入catch块,首先执行打印输出:catch block / by zero
  2. 接下来会执行catch块的throw e语句,向上抛出异常,而finally语句又是必须执行的,此时程序会先执行finally块。
  3. 进入finally块后会输出:finally block invoked!!! 和finally block invoked, ret is 1
  4. finally块执行到return ret时,该方法直接返回了ret的值,
  5. 在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相关推荐

  1. 可惜Java中没有yield return

    项目中一个消息推送需求,推送的用户数几百万,用户清单很简单就是一个txt文件,是由hadoop计算出来的.格式大概如下: uid caller 123456 12345678901 789101 12 ...

  2. 大数据——Java中异常的捕获和处理

    Java中异常的捕获和处理 异常的概述 认识异常 Java异常体系结构 Java异常处理机制 异常处理 使用try-catch处理异常 使用try-catch-finally处理异常 使用多重catc ...

  3. java中异常抛出后代码还会继续执行吗

    java中异常抛出后代码还会继续执行吗 参考文章: (1)java中异常抛出后代码还会继续执行吗 (2)https://www.cnblogs.com/xiaoshen666/p/10848827.h ...

  4. java 错误码设计_关于Java中异常的设计

    Java中异常分为checked 和 unchecked 两种. 首先, 什么时候使用checked,什么时候用unchecked? checked本意是要求调用方处理这个异常, unchecked ...

  5. java抛出数组格式异常,Java中异常

    一.异常的概述 在Java中,把异常信息封装成了一个类.当出现了问题时,就会创建异常类对象并抛出异常相关的信息(如异常出现的位置.原因等). 二.异常的继承体系和错误的区别 1.异常的继承体系 Thr ...

  6. Java中finally和return执行顺序

    思考一个问题 Java异常捕获机制try-catch-finally块中的finally语句是否一定会被执行?起码在以下两种情况下是不会被执行的: 1.在try之前就返回了,try没有执行到. 2.t ...

  7. JAVA产生异常并打印,Java中异常打印输出的常见方法整理

    前言 Java异常是在Java应用中的警报器,在出现异常的情况下,可以帮助我们程序猿们快速定位问题的类型以及位置.但是一般在我们的项目中,由于经验阅历等多方面的原因,依然有若干的童鞋在代码中没有正确的 ...

  8. java中异常和集合

    1. java中处理错误情况有两种,1  Error,2  Exception error是无法处理的,Exception是可以处理的情况. Exception中又有两种情况,RuntimeExcep ...

  9. java中finally和return的执行顺序

    注意:return的位置... 从这几个例子中可以看到,如果try之前没有有条件的return,则try..catch..finally语句块中的语句都是顺序执行(如果try中或者catch中 有re ...

最新文章

  1. 在网络推广外包中企业网站排名优化在网络推广外包中如何实现?
  2. golang的makefile编写
  3. getopt的用法与optarg
  4. 程序员必知的8大排序(二)-------简单选择排序,堆排序(java实现)
  5. ie兼容响应式布局的实现总结 和 针对ie浏览器的CSS
  6. 【lucene】lucene 高级搜索
  7. python入门——P50模块:模块就是程序
  8. HMM一文搞懂HMM(隐马尔可夫模型)
  9. 《HBase企业应用开发实战》—— 3.6 本章小结
  10. FLEX 24节气算法
  11. XLSTransformer生成excel文件简单示例
  12. 基于php工程项目管理系统
  13. 关于盒子背景图片布局
  14. 常用的音频处理库介绍
  15. jquery ZeroClipboard实现黏贴板功能,兼容所有浏览器
  16. 微信公众号展示页面模板
  17. win10系统下,KMSpico安装过程中出现“无法完成操作,因为文件包含病毒或潜在的垃圾软件”
  18. Packet(信息包)
  19. 从云计算六大技术趋势,看亚马逊云科技的领先优势
  20. python程序创建词云 中国地图_Python基于wordcloud及jieba实现中国地图词云图

热门文章

  1. 做形态学方法的团队_图像分割实战-分水岭分割方法和GrabCut 算法
  2. 神经网络的激活函数、并通过python实现激活函数
  3. 矩阵论复习-过渡矩阵、生成子空间、表示矩阵、度量矩阵、酉空间、内积
  4. 监督学习和无监督学习_机器学习的要素是什么? 有监督学习和无监督学习两大类...
  5. ajax异步加载和cmd,异步传输Ajax(JQ)
  6. 填充table_Excel Power Query | 向下填充的逆过程
  7. 云联惠身份认证得多久_【转发扩散】你完成认证了吗?老来网APP也可以刷脸认证哦!...
  8. 树莓派 小屏幕_树莓派学习手动积累(1)
  9. php 图片不让下载,php简单实现文件或图片强制下载的方法
  10. 【OpenCV 例程200篇】67. 空间域图像增强的综合应用