JAVA try..catch..finally与return执行顺序研究
来源:互联网 发布:免费vpn软件下载 编辑:程序博客网 时间:2024/06/06 05:26
之前碰到了这类问题,然后在CSDN上看到了这方面的讲解了,觉得获益匪浅。自己也去实践了一下,稍微分享一下心得。第一次发博,表述错误与不清楚的地方多多包涵。
基本测试
先上测试代码,logger功能可以看成print
@Testpublic void tryCatchFinallyTest() { Long startTimeMilSec; Long endTimeMilSec; startTimeMilSec = System.currentTimeMillis(); logger.info("start test, current time : {}", startTimeMilSec); String returnInfo = tryCatchFinallyTestFun().getInfo(); logger.info("return info : {}", returnInfo); endTimeMilSec = System.currentTimeMillis(); logger.info("end test, current time : {}", endTimeMilSec); logger.info("total run time : {} milSec", endTimeMilSec - startTimeMilSec);}private TryCatchFinallyTestClass tryCatchFinallyTestFun() { TryCatchFinallyTestClass testResult = new TryCatchFinallyTestClass(); testResult.setInfo("origin text before change"); try { logger.info("start try"); throw new Exception("test exception"); } catch (Exception e) { logger.info("start catch"); return testResult; } finally { logger.info("start finally"); testResult.setInfo("text change by finally"); logger.info("end finally"); }}private class TryCatchFinallyTestClass { private String info; public String getInfo() { return info; } public void setInfo(String info) { this.info = info; }}
基本思路:tryCatchFinallyFun()函数会按照try->catch->finally执行,在catch中return(在try中return原理应该一样,就不单独测试了)。在finally中修改return的值(为了防止系统自带类引起意外,建了一个测试类TryCatchFinallyTestClass存返回信息)。tryCatchFinallyTest调用测试函数,然后打印各个阶段的执行信息。测试结果如下:
17:19:41.821 [main] INFO com.study.javaweb.test1.methodTest.JavaMethodTest - start test, current time : 1505467181821
17:19:41.823 [main] INFO com.study.javaweb.test1.methodTest.JavaMethodTest - start try
17:19:41.823 [main] INFO com.study.javaweb.test1.methodTest.JavaMethodTest - start catch
17:19:41.823 [main] INFO com.study.javaweb.test1.methodTest.JavaMethodTest - start finally
17:19:41.823 [main] INFO com.study.javaweb.test1.methodTest.JavaMethodTest - end finally
17:19:41.823 [main] INFO com.study.javaweb.test1.methodTest.JavaMethodTest - return info : text change by finally
17:19:41.823 [main] INFO com.study.javaweb.test1.methodTest.JavaMethodTest - end test, current time : 1505467181823
17:19:41.823 [main] INFO com.study.javaweb.test1.methodTest.JavaMethodTest - total run time : 2 milSec
可以看到执行顺序:主程序->try->catch->finally->return->返回,而且最终返回的值被finally修改了。
进一步地研究一下:
在catch、finally中引发异常对return结果的影响
测试1:
如果在catch中有意引发一个exception会不会影响return的返回?
private TryCatchFinallyTestClass tryCatchFinallyTestFun() { TryCatchFinallyTestClass testResult = new TryCatchFinallyTestClass(); testResult.setInfo("origin text before change"); try { logger.info("start try"); throw new Exception("test exception"); } catch (Exception e) { logger.info("start catch"); testResult = new TryCatchFinallyTestClass(); testResult.getInfo().getBytes();//throws exception here logger.info("end catch"); return testResult; } finally { logger.info("start finally"); testResult = new TryCatchFinallyTestClass(); testResult.setInfo("text changed by finally"); logger.info("end finally"); }}如果finally中不设置return, 果然抛出异常java.lang.NullPointerException
那我在finally中设置return会怎么样?设置return后结果:
17:51:38.243 [main] INFO com.study.javaweb.test1.methodTest.JavaMethodTest - start test, current time : 1505469098243
17:51:38.245 [main] INFO com.study.javaweb.test1.methodTest.JavaMethodTest - start try
17:51:38.245 [main] INFO com.study.javaweb.test1.methodTest.JavaMethodTest - start catch
17:51:38.245 [main] INFO com.study.javaweb.test1.methodTest.JavaMethodTest - start finally
17:51:38.245 [main] INFO com.study.javaweb.test1.methodTest.JavaMethodTest - end finally
17:51:38.245 [main] INFO com.study.javaweb.test1.methodTest.JavaMethodTest - return info : text changed by finally
17:51:38.245 [main] INFO com.study.javaweb.test1.methodTest.JavaMethodTest - end test, current time : 1505469098245
17:51:38.245 [main] INFO com.study.javaweb.test1.methodTest.JavaMethodTest - total run time : 2 milSec
catch被中断了,但是函数正常返回
测试2:
在catch中return但是在finally中引发异常,会不会影响返回
private TryCatchFinallyTestClass tryCatchFinallyTestFun() { TryCatchFinallyTestClass testResult = new TryCatchFinallyTestClass(); testResult.setInfo("origin text before change"); try { logger.info("start try"); throw new Exception("test exception"); } catch (Exception e) { logger.info("start catch"); testResult.setInfo("text changed by catch"); logger.info("end catch"); return testResult; } finally { logger.info("start finally");// testResult = new TryCatchFinallyTestClass();// testResult.setInfo("text changed by finally"); testResult = new TryCatchFinallyTestClass(); testResult.getInfo().getBytes();//throws exception here logger.info("end finally"); return testResult; }
}
结果:java.lang.NullPointerException,异常并影响返回运行环境:http://blog.csdn.net/leean950806/article/details/77994864
- JAVA try..catch..finally与return执行顺序研究
- java中try catch finally与return的执行顺序
- try catch finally与return的执行顺序
- try catch finally与return的执行顺序
- try catch finally 与return的执行顺序
- Java中try-catch-finally-return的执行顺序
- 关于Java中try-catch-finally-return的执行顺序
- 关于Java中try-catch-finally-return的执行顺序
- Java含有return 的try catch finally的执行顺序
- Java中try-catch-finally-return的执行顺序
- Java中的try-catch-finally-return的执行顺序
- 关于Java中try-catch-finally-return的执行顺序
- 浅析Java try....catch....finally中return语句执行顺序
- Java中try-catch-finally-return的执行顺序
- java异常try catch finally中return具体执行顺序
- Java中try、catch、finally、return的执行顺序
- Java —— try-catch-finally-return的执行顺序
- try, catch, finally, return的执行顺序
- AndroidStudio svn 上传不了.so 文件 .a文件
- Include动态指令和静态指令的区别
- 获取动态添加的节点的ID
- super.onDestroy(); 应该放在第一行还是放在最后一行?为什么?
- JS中创建json数组,并获取input中的id和value存储
- JAVA try..catch..finally与return执行顺序研究
- windows主机连不上linux虚拟机
- Arangodb入门教程(零)下载安装
- 基于Alluxio,Mesos和Minio构建可扩展基因组数据处理流水线
- JMS 部署遇到的常规问题
- docker Failed to get D-Bus connection: Operation not permitted
- laravel学习
- JavaScript基础之删除DOM
- HTML5基础知识汇总_(2)自定义属性及表单新特性