有return的情况下try_catch_finally的执行顺序
java异常处理之try_catch_finally
看下面的一个列子:
public class TestException {
int goabl=1;
public TestException() {
}
int testEx() throws Exception {
int ret = 1;
try {
ret++;
return ret;
} catch (Exception e) {
ret++;
return ret;
} finally {
ret=0;
}
}
int testEx1() throws Exception {
int ret = 1;
try {
ret++;
int t=ret/(ret-2);//制造一个exception
return ret;
} catch (Exception e) {
ret++;
return ret;
} finally {
ret=0;
}
}
int testEx2() throws Exception {
int ret = 1;
try {
ret++;
int t=ret/(ret-2);//制造一个exception
return ret;
} catch (Exception e) {
ret++;
return ret;
} finally {
ret=0;
return ret;
}
}
int testEx3() throws Exception {
int ret = 1;
try {
ret++;
return ret;
} catch (Exception e) {
ret++;
return ret;
} finally {
ret=0;
return ret;
}
}
int testEx4() throws Exception {
try {
goabl++;
return goabl;
} catch (Exception e) {
goabl++;
return goabl;
} finally {
goabl=0;
}
}
public static void main(String[] args) {
TestException testException1 = new TestException();
try {
System.out.println(testException1.testEx());
System.out.println(testException1.testEx1());
System.out.println(testException1.testEx2());
System.out.println(testException1.testEx3());
System.out.println(testException1.testEx4());
} catch (Exception e) {
e.printStackTrace();
}
}
}
程序的运行结果是:
2
3
0
0
2
如果你的答案是正确的且知道是为什么,那么下面的内容相信你也不用看了。
首先这里我就不细说java的异常处理机制,想了解的同学可以去看看java异常处理深入研究。
我们首先对try_catch_finally的执行顺序进行说明。
首先我可以很明确的告诉大家try_catch_finally的执行顺序其实很简单,首先是执行try中的 语句如果有异常就直接进入catch,最后finally一定会执行。
这样可能有人会问那为什么第一个的输出不是0呢?别急我们来一个一个说明。
testEx
try语句中没有任何异常所以catch不会执行。ret进行了一次++操作,这时程序进行了返回,在内存中会生成一个临时变量,来保存ret,也就是说ret的值赋给了一个临时变量所以,ret在finally中赋值为零并不会改变返回的值所以输出为2;
testEx1
这次我们人为的在try的语句中制造了exception这样程序会进入到catch中,所以ret被++两次,同样finally中的语句不能对返回值产生影响,所以输出为3;
testEx2
相对于testEx1我们在finally语句中加入了return语句,说以函数的返回值变成了0,这样说名我能函数的返回值实在finally执行结束后才确定的。
testEx3
同testEx2一样由于finally中加入了return语句,返回值为0;
testEx4
在这个函数中我们把操作的对象改为了全局变量,结合最后一个输出我们可以知道函数的返回结果的确是被一个临时变量接收了,所以函数返回的结果是2,但是goabl已经变为0了。
try()里面有一个return语句,那么后面的finally{}里面的code会不会被执行,什么时候执行,是在return前还是return后?
自己写了个代码测试了一下:
public static void main(String[] args) {
int i=getInt();
System.out.println(i);
}
private static int getInt() {
// TODO Auto-generated method stub
try {
return 0;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
return 1;
}
}
输出的结果是1
案例2:







有return的情况下try_catch_finally的执行顺序的更多相关文章
- throw和throws的区别以及try,catch,finally在有return的情况下执行的顺序
一,抛出异常有三种形式,一是throw,一个throws,还有一种系统自动抛异常.下面它们之间的异同. (1).系统自动抛异常 1.当程序语句出现一些逻辑错误.主义错误或类型转换错误时,系统会自动抛出 ...
- Java基础知识强化之IO流笔记06:有return的情况下try catch finally的执行顺序
1. 给出结论: (1)不管有木有出现异常,finally块中代码都会执行:(2)当try和catch中有return时,finally仍然会执行:(3)finally是在return后面的表达式运算 ...
- 有return的情况下try catch finally的执行顺序(转)
结论:1.不管有木有出现异常,finally块中代码都会执行:2.当try和catch中有return时,finally仍然会执行:3.finally是在return后面的表达式运算后执行的(此时并没 ...
- try catch finally的执行顺序(有return的情况下)
结论:1.不管有木有出现异常,finally块中代码都会执行:2.当try和catch中有return时,finally仍然会执行:3.finally是在return后面的表达式运算后执行的(此时并没 ...
- 有return的情况下try catch finally的执行顺序
结论:1.不管有木有出现异常,finally块中代码都会执行:2.当try和catch中有return时,finally仍然会执行:3.finally是在return后面的表达式运算后执行的(此时并没 ...
- 有return的情况下try catch finally的执行顺序(最有说服力的总结)
结论:1.不管有木有出现异常,finally块中代码都会执行:2.当try和catch中有return时,finally仍然会执行:3.finally是在return后面的表达式运算后执行的(此时并没 ...
- 【Java疑难杂症】有return的情况下try catch finally的执行顺序
有这样一个问题,异常处理大家应该都不陌生,类似如下代码: public class Test { public static void main(String[] args) { int d1 = 0 ...
- 有return的情况下try catch finally的执行顺序(转)
结论:1.不管有没有出现异常,finally块中代码都会执行:2.当try和catch中有return时,finally仍然会执行:3.finally是在return后面的表达式运算后执行的(此时并没 ...
- [转]有return的情况下try catch finally的执行顺序
结论: 1.不管有没有出现异常,finally块中代码都会执行: 2.当try和catch中有return时,finally仍然会执行: 3.finally是在return后面的表达式运算后执行的(此 ...
随机推荐
- Pytorch写CNN
用Pytorch写了两个CNN网络,数据集用的是FashionMNIST.其中CNN_1只有一个卷积层.一个全连接层,CNN_2有两个卷积层.一个全连接层,但训练完之后的准确率两者差不多,且CNN_1 ...
- python基本操作-文件、目录及路径
目录 1 前言 2 文件夹操作 2.1 查询操作 2.2 创建操作 2.3 删除操作 2.4 修改操作 3 文件操作 3.1 查询操作 3.2 创建操作 3.3 修改操作 3.4 删除 4 路径操作 ...
- echarts实现漏斗转化率图表效果
1.在用echarts实现图表的旅途中遇到这样一个需求,用柱图展示漏斗转化效果,下图展示: 别的不多说了,就说解决方式吧,用的series中的markpoint来实现. option.series[0 ...
- HEARTBLEED 漏洞复现
漏洞分析的两篇文章 https://blog.csdn.net/javajiawei/article/details/82429886 https://xz.aliyun.com/t/1771 set ...
- Weblogic 漏洞利用总结
整理的一些利用方式,后续会更新到15年至今的洞 后台爆破拿shell 后台爆破: 部署-安装-上载文件 制作war包,一直下一步,最好保存 jar -cvf shell.war ./shll/* 上传 ...
- raw_input和input
昨天在OJ上做CTF的题目,发现有道python的题目很有意思,让我知道了raw_input和input的区别,并且能干一些别的事情. 官方文档上说,input()相当于eval(raw_input( ...
- SpringBoot实现微信小程序登录的完整例子
目录 一.登录流程 二.后端实现 1.SpringBoot项目结构树 2.实现auth.code2Session 接口的封装 3.建立用户信息表及用户增删改查的管理 4.实现登录认证及令牌生成 三.前 ...
- Rocket - 断句 - Diplomatic Design Patterns: A TileLink Case Study
https://mp.weixin.qq.com/s/afRVgTCYs1Mxu898uSmVaQ 整理一篇介绍Diplomacy和TileLink的文章. 原文链接: https://carrv ...
- Java实现三人年龄
2 三人年龄 三个神秘蒙面人来访F博士. 博士询问他们年龄时,他们说:我们中年龄最小的不超过19岁.我们3人年龄总和为70岁.且我们三人年龄的乘积是所有可能情况中最大的. 请帮助F博士计算他们的年龄, ...
- java实现第五届蓝桥杯排列序数
排列序数 如果用a b c d这4个字母组成一个串,有4!=24种,如果把它们排个序,每个串都对应一个序号: abcd 0 abdc 1 acbd 2 acdb 3 adbc 4 adcb 5 bac ...