前言

  在开发过程中异常处理是经常用到的,相信大部分使用try、catch、finally的只知道try中出现异常catch中会捕获,finally块中代码何时都会执行。其实其中还有很多细微的知识点,下面我们来学习学习。

try、catch、finally执行顺序

  try块和catch块中逻辑基本相同。try中出现异常跳转到catch,若catch中出现异常则跳转到finally,try或catch正常执行若存在return则先执行return的代码并保存返回值信息(基本类型保存值信息,引用类型则保存地址信息下面会说明)然后执行finally,若finally中出现异常或包含return则执行结束,若无异常且没有return则会执行try或catch中的return或结束。整体执行流程如下:

说明与代码展示

  当try-catch-finally中无return时,如果try块中出现异常则进入catch中,执行完catch中代码后进入finally,如果catch中出现异常仍然会执行finally代码块,finally块执行结束后抛出异常。try块中无异常时执行完try块直接执行finally。
以catch中抛出异常为例,代码如下:

public static int testNoReturn(){int res = 1;try{res++;System.out.println("try ======== res:"+res);int a = 1/0;}catch (Exception e){res++;System.out.println("catch ======== res:"+res);int a = 1/0;}finally {res++;System.out.println("finally ======== res:"+res);}return res;}

  catch中抛出异常后finally仍然会执行,执行结束后抛出catch中的异常。执行结果如下:

  try或catch中存在return 时流程基本一致所以合到一起讲下。finally中包含return时会覆盖try或catch中的return值,而且会覆盖catch中抛出的异常信息。
try或catch包含return,返回值为基本数据类型代码如下:

 public static int testTryCatchReturn(){int res = 1;try{res++;System.out.println("try ======== res:"+res);int a=1/0;return res;}catch (Exception e){res++;System.out.println("catch ======== res:"+res);return res;}finally {res++;System.out.println("finally ======== res:"+res);}}

执行结果如下:

try或catch包含return,返回值为引用数据类型代码如下:

public static List testTryCatchReturn1(){List res = new ArrayList();try{res.add(1);System.out.println("try ======== res:"+res);int a=1/0;return res;}catch (Exception e){res.add(2);System.out.println("catch ======== res:"+res);return res;}finally {res.add(3);System.out.println("finally ======== res:"+res);}}

执行结果如下:

finally中将引用的返回值赋值为null时代码如下:

public static List testTryCatchReturn1(){List res = new ArrayList();try{res.add(1);System.out.println("try ======== res:"+res);int a=1/0;return res;}catch (Exception e){res.add(2);System.out.println("catch ======== res:"+res);return res;}finally {res.add(3);System.out.println("finally ======== res:"+res);res = null;System.out.println("finally ======== res:"+res);}}

执行结果如下:

  try或catch中存在return时会将返回值进行保存(基本数据类型直接保存,引用数据类型则保存引用地址),然后执行finally块中的代码,finally块中代码执行结束后直接返回。因为引用类型返回时保存的是地址,所以修改引用对象时返回信息会发生变化,但如果赋值为null时地址指向的信息并未发生变化所以返回值依然是地址指向的对象。
  当finally中存在return时会覆盖try或catch中返回的数据。如果catch中抛出异常时会将该异常覆盖掉。以catch中存在异常的情况为例,代码如下:

public static int testFinallyReturn(){int res = 1;try{res++;System.out.println("try ======== res:"+res);int a=1/0;return res;}catch (Exception e){res++;System.out.println("catch ======== res:"+res);int a = 1/0;return res;}finally {res++;System.out.println("finally ======== res:"+res);return res;}}

执行结果如下:

finally的return会覆盖catch或try的return和异常信息。

总结

  1、无return且未出现异常时try->finally,出现异常时try->catch->finally。
  2、try或catch中有return时,返回数据为基本类型则finally代码块执行完后不会更改,返回值为引用类型,return保存的是引用地址,finally块中代码执行完会改变返回值。
  3、finally中存在return时会覆盖try或catch中的返回值信息,若try或catch中抛出异常也会被finally中的return覆盖。

try、catch、finally 用法总结相关推荐

  1. try()...catch()的用法

    前面小括号中出现问题,文件流会自动关闭 摘自网友回复: 在stackoverflow偶尔看到的一个关于try()...catch()的用法,通常我们使用try...catch()捕获异常的,如果遇到类 ...

  2. php中throw try,PHP的Try, throw 和 catch简单用法_PHP教程

    PHP的Try, throw 和 catch简单用法 本文简单记录一下关于php中的 Try, throw 和 catch 的用法,后面有时间再做一个详细的解析. Try - 使用异常的函数应该位于 ...

  3. js中try和catch的用法

    js中try和catch的用法 版权声明:本文为@lyhh5原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明 原文链接:https://blog.csdn.net/l ...

  4. C++:try catch语句用法

    C++中try catch语句用法有非常灵活,有许多种组合: 这里简单介绍以下最基本的用法: 1. 格式 try{ ... } catch{ ... } try语句块是用来判断是否有异常: catch ...

  5. try/catch的用法

    参考原文:https://www.cnblogs.com/freshmen/p/4424667.html 1.try/catch用法基础介绍 try{//程序中抛出异常throw value;}cat ...

  6. php mysql异常捕获_PHP中try{}catch{}的用法及异常处理.对数据库的事物支持

    try 只有抛出异常才能被catch捕获 public  function test1() { Db::startTrans(); // 事务 try{ // 第1条数据更新id 18 $a=Db:: ...

  7. 浅谈Java中try catch 的用法

    我们编译运行程序出错的时候,编译器就会抛出异常.抛出异常要比终止程序灵活许多,这是因为 的Java提供了一个"捕获"异常的的处理器(处理器)对异常情况进行处理. 如果没有提供处理器 ...

  8. try catch的用法

    <div id='demo'></div> try { document.getElementById("demo").innerHTML ='上帝'   ...

  9. try和catch的用法

    try catch 错误处理: 执行规则:首先执行try中的代码 如果抛出异常会由catch去捕获并执行 如果没有发生异常 catch去捕获会被忽略掉 但是不管有没有异常最后都会执行. try 语句使 ...

  10. try catch finally 用法

    在讲之前我们先看一段程序: public class Test {public static void main(String[] args) {System.out.println("re ...

最新文章

  1. jquery实现截取pc图片_jquery 上传图片自由截取
  2. 第七章httpd.conf主配置文件的详解
  3. RT-Thread的I/O设备模块及其驱动实现步骤
  4. 直播预告丨加速消费金融行业运营体系新升级,驱动经营提质增效!
  5. 矩阵论基础知识4——强大的矩阵奇异值分解(SVD)及其应用
  6. Moving stones(暴力+思维)
  7. 使用 python 开发 Web Service
  8. JDK 13中的JEP 355文本块
  9. JVM优化系列-详解JDK1.8 Metaspace 参数配置
  10. (13)System Verilog随机数组
  11. Android、Java泛型扫盲
  12. kubernetes集群搭建
  13. sql 查询所有子节点示例
  14. web 前端学习之制作网页视频
  15. 机器学习 —— 神经网络(matlab)
  16. Admob的PIN码接收教程
  17. 科技云报道:率先迈入“10微秒”时代,腾讯云存储跑出加速度
  18. 文章转载-狂人日记-鲁迅
  19. 奋斗(2)第16集剧情介绍
  20. 怎么将手机里的PDF文件转成图片

热门文章

  1. 图形学中4x4矩阵的理解
  2. 点餐必须扫码属违法!法院刚判了:过度收集个人隐私信息
  3. 扫码反馈,“码”上回复:二维码在业主意见反馈中的应用
  4. 估值近百亿,“创维三把手”酷开科技能否顺利赶考?
  5. IDEA常用配置汇总
  6. 2017283421俞烨炜
  7. 现在做什么能挣钱?想要在互联网赚钱,一定要懂这些!
  8. 企业上云的选择及好处
  9. 小米路由器3c 虚拟服务器,小米路由器3C,怎么刷breed啊?可以吗
  10. python实现推广小项目