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的执行顺序的更多相关文章

  1. throw和throws的区别以及try,catch,finally在有return的情况下执行的顺序

    一,抛出异常有三种形式,一是throw,一个throws,还有一种系统自动抛异常.下面它们之间的异同. (1).系统自动抛异常 1.当程序语句出现一些逻辑错误.主义错误或类型转换错误时,系统会自动抛出 ...

  2. Java基础知识强化之IO流笔记06:有return的情况下try catch finally的执行顺序

    1. 给出结论: (1)不管有木有出现异常,finally块中代码都会执行:(2)当try和catch中有return时,finally仍然会执行:(3)finally是在return后面的表达式运算 ...

  3. 有return的情况下try catch finally的执行顺序(转)

    结论:1.不管有木有出现异常,finally块中代码都会执行:2.当try和catch中有return时,finally仍然会执行:3.finally是在return后面的表达式运算后执行的(此时并没 ...

  4. try catch finally的执行顺序(有return的情况下)

    结论:1.不管有木有出现异常,finally块中代码都会执行:2.当try和catch中有return时,finally仍然会执行:3.finally是在return后面的表达式运算后执行的(此时并没 ...

  5. 有return的情况下try catch finally的执行顺序

    结论:1.不管有木有出现异常,finally块中代码都会执行:2.当try和catch中有return时,finally仍然会执行:3.finally是在return后面的表达式运算后执行的(此时并没 ...

  6. 有return的情况下try catch finally的执行顺序(最有说服力的总结)

    结论:1.不管有木有出现异常,finally块中代码都会执行:2.当try和catch中有return时,finally仍然会执行:3.finally是在return后面的表达式运算后执行的(此时并没 ...

  7. 【Java疑难杂症】有return的情况下try catch finally的执行顺序

    有这样一个问题,异常处理大家应该都不陌生,类似如下代码: public class Test { public static void main(String[] args) { int d1 = 0 ...

  8. 有return的情况下try catch finally的执行顺序(转)

    结论:1.不管有没有出现异常,finally块中代码都会执行:2.当try和catch中有return时,finally仍然会执行:3.finally是在return后面的表达式运算后执行的(此时并没 ...

  9. [转]有return的情况下try catch finally的执行顺序

    结论: 1.不管有没有出现异常,finally块中代码都会执行: 2.当try和catch中有return时,finally仍然会执行: 3.finally是在return后面的表达式运算后执行的(此 ...

随机推荐

  1. conda虚拟环境安装

    一.背景 需要学习mxnet,建一个conda虚拟软件环境. 二.步骤 1.下载anaconda安装文件:https://mirrors.tuna.tsinghua.edu.cn/anaconda/m ...

  2. Cypress系列(9)- Cypress 编写和组织测试用例篇 之 钩子函数Hook

    如果想从头学起Cypress,可以看下面的系列文章哦 https://www.cnblogs.com/poloyy/category/1768839.html Hook 就是常说的钩子函数,在 pyt ...

  3. Java实现 蓝桥杯 算法训练 审美课

    算法训练 审美课 时间限制:1.0s 内存限制:256.0MB 提交此题 问题描述 <审美的历程>课上有n位学生,帅老师展示了m幅画,其中有些是梵高的作品,另外的都出自五岁小朋友之手.老师 ...

  4. (Java实现) 营救

    问题 B: 营救 时间限制: 1 Sec 内存限制: 128 MB 题目描述 铁塔尼号遇险了!他发出了求救信号.距离最近的哥伦比亚号收到了讯息,时间就是生命,必须尽快赶到那里. 通过侦测,哥伦比亚号获 ...

  5. Java实现 LeetCode 433 最小基因变化

    433. 一条基因序列由一个带有8个字符的字符串表示,其中每个字符都属于 "A", "C", "G", "T"中的任意一 ...

  6. Java实现 LeetCode 432 全 O(1) 的数据结构

    432. 全 O(1) 的数据结构 实现一个数据结构支持以下操作: Inc(key) - 插入一个新的值为 1 的 key.或者使一个存在的 key 增加一,保证 key 不为空字符串. Dec(ke ...

  7. Java实现 蓝桥杯VIP 算法训练 成绩的等级输出

    输入一个百分制的成绩t后,按下式输出它的等级.等级为:90100为A,8089为B,7079为C,6069为D,0~59为E. 样例输入 98 样例输出 A import java.util.Scan ...

  8. Java实现 LeetCode 7整数反转

    7. 整数反转 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 1: 输入: 123 输出: 321 示例 2: 输入: -123 输出: -321 示例 3: 输入: ...

  9. Java实现蓝桥杯正则问题

    题目描述 考虑一种简单的正则表达式: 只由 x ( ) | 组成的正则表达式. 小明想求出这个正则表达式能接受的最长字符串的长度. 例如 ((xx|xxx)x|(x|xx))xx 能接受的最长字符串是 ...

  10. java代码(5) ---guava之Multiset

    guava之Multiset  一.概述 Guava提供了一个新集合类型Multiset,它可以多次添加相等的元素,且和元素顺序无关,Multiset继承于JDK的Collection接口,而不是Se ...