理清Java中try-catch-finally带return的执行顺序
前言:try-catch-finally带return和异常时,它们之间执行顺序问题是留下来的一个小疑问,今天搞清楚它们
第一种情况:无异常
//1.try-catch-finally都带有return
public static int method_1(){
int num = 1;
try {
System.out.println("---try run---");
return ++num;
} catch (Exception e) {
System.out.println("---catch run---");
return --num;
}finally {
num = 10;
System.out.println("---finally run---");
//return num;
}
}
没有异常,程序执行完try代码块中的内容最后执行finally中的代码,输出结果为下:

1.1:可能会有所疑惑:为什么在finally块中对num值进行了修改,输出的依然是2?
原因是:jdk走到try中的return时,将需要return的值放到了一个临时存储区中去,虽然finally中对num值进行了修改,并不会影响返回结果,返回的依然是临时存储区的那
1.2: 当将finally代码块中的return注释去掉,返回值为什么为10?
原因是:无论是在try或者是catch中进行了return,最后都会执行finally中的代码,如果在finally中进行了return,则函数到此就退出了。
第二种情况:有异常
public static int method_2(){
int num = 1;
try {
num = num/0;
System.out.println("---try run---");
return ++num;
} catch (Exception e) {
System.out.println("---catch run---");
return --num;
}finally {
num = 10;
System.out.println("---finally run---");
//return num;
}
}
输出结果如下:

其实也很简单理解:执行try中的代码块到num=num/0,发现有错被catch捕捉到,执行catch中的代码块,最后在执行finally中的代码块,与第一种情况相同,catch中需要return的值被放到了栈中,所以finally中对num的改变并不会影响实际返回的值。
小结:
1.finally代码块中内容最后都会被执行,无论是在try中return还是catch中return
2.finally中最好不要进行return操作,最好在try-catch中进行或者函数的末尾进行
3.return的值会被存到临时存储区中去,即使finally代码块中对return值进行修改,也不会影响到最终返回值。
练习题:
练习题一:
public static int method_3() {
int num = 1;
try {
num=1/0;
return num;
} catch ( Exception e) {
System.out.println("catch run...");
return num;
} finally {
++num;
}
}

练习题二:
public static int method_4() {
int num = 1;
try {
return num;
} catch (Exception e) {
System.out.println("catch run...");
} finally {
++num;
}
return 20;
}

练习题三:
public static int method_5() {
int num = 1;
try {
num = 1 / 0;
return num;
} catch (ArithmeticException e) {
System.out.println("catch_1 run ...");
return --num;
} catch (Exception e) {
System.out.println("catch_2 run ...");
return ++num;
} finally {
++num;
}
}

这题关键是清楚num=num/0报的是什么错误
练习题五:
public static ArrayList test(){
ArrayList<String> list = new ArrayList<>();
try{
list.add("张三");
System.out.println("try block");
return list;
}catch (Exception e){
list.add("李四");
System.out.println("catch block");
return list;
}finally {
list.add("王五");
System.out.println("finally block");
return list;
}
}
运行完后list为["张三","王五"]。
其他try-catch-finally练习题:https://blog.csdn.net/jinzhu_li/article/details/38560203
理清Java中try-catch-finally带return的执行顺序的更多相关文章
- java中 try catch finally和return联合使用时,代码执行顺序的小细节
代码1测试 public static void main(String[] args) { aa(); } static int aa() { try { int a=4/0; } catch (E ...
- JAVA中try、catch、finally带return的执行顺序总结
异常处理中,try.catch.finally的执行顺序,大家都知道是按顺序执行的.即,如果try中没有异常,则顺序为try→finally,如果try中有异常,则顺序为try→catch→final ...
- Java中if else条件判断语句的执行顺序
学习目标: 掌握 if else 条件判断的使用 学习内容: 1.if语法 if(boolean表达式) { 语句体; } if后面的{}表示一个整体-代码块,称之为语句体,当boolean表达式为t ...
- 【转】Java中try catch finally语句中含有return语句的执行情况(总结版)
Java中try catch finally语句中含有return语句的执行情况(总结版) 有一点可以肯定,finally块中的内容会先于try中的return语句执行,如果finall语句块中也有r ...
- java中的异常以及 try catch finally以及finally的执行顺序
java中的 try.catch.finally及finally执行顺序详解: 1.首相简单介绍一下异常以及异常的运行情况: 在Java中异常的继承主要有两个: Error和Exception 这两个 ...
- 我敢说你不一定完全理解try 块,catch块,finally 块中return的执行顺序
大家好,今天我们来讲一个笔试和面试偶尔都会问到的问题,并且在工作中不知道原理,也会造成滥用. 大家可能都知道,try 块用来捕获异常,catch块是处理try块捕获的异常,finally 块是用来关闭 ...
- Java中try,catch,finally的用法
Java中try,catch,finally的用法,以前感觉还算熟悉,但看到一篇博文才有更深点的理解,总结网友博客如下. Java异常处理的组合方式: 1.try+catch 运行流程:运行到try ...
- java中break、continue、return作用
java中break.continue.return作用 0.首先要明确:break和continue是作用对象是循环体:而return的作用对象是方法 break:在执行完本次循环后,跳出所在的循环 ...
- Javascript中页面加载完成后优先执行顺序
Javascript中页面加载完成后优先执行顺序 document优先于windowwindow优先于element //document加载完成执行方法体 document.addEventList ...
随机推荐
- pure-ftpd 配置
# Disallow anonymous connections. Only allow authenticated users. NoAnonymous yes # If you want simp ...
- MDK(KEIL) 两步解决 中文乱码 及 中文光标 半个半个跳的问题
1. 如果已经用MDK(KEIL)的默认设置写了好多中文,那么先用notepad把文件一一打开然后转变编码格式为 utf-8 without ROM,如下: 2. 如果还没有开始编辑,或者已经用not ...
- iBATIS存储过程
使用iBATIS配置来调用存储过程.为了理解这一章,首先需要了解我们是如何在MySQL中创建一个存储过程. 在继续对本章学习之前,可以通过MySQL存储过程. 我们已经在MySQL下有EMPLOYEE ...
- adb shell 查看内存信息
1.根据包名来查看指定的APP指定数据adb shell "top | grep com.xxx.xxx" 由于这样打印出来的数据没有参数名,可以参考这个命令来看:adb shel ...
- HDU 2874 /// tarjan离线求森林里两点的距离
题目大意: 在一个森林里 询问 u v 两点 若不能到达输出 "Not connected" 否则输出两点距离 https://blog.csdn.net/keyboarderqq ...
- Datagrid 的 SelectItem 和 SelectValue 如何区分、DataContext 和 ItemSource 在绑定时该绑哪个?
1.selecteditem.selectedvalue.selectedvaluepath三个属性 场景: class T { public string A { get; set; } publi ...
- 2019-8-31-dotnet-数组自动转基类数组提示-Co-variant-array-conversion-是什么问题
title author date CreateTime categories dotnet 数组自动转基类数组提示 Co-variant array conversion 是什么问题 lindexi ...
- YARN框架与MapReduce1.0框架的对比分析
- 同步图计算实现最短路径Dijkstra算法
同上篇讲述pageRank一样,考虑一个顶点V. 根据顶点算法通常步骤1) 接收上个超步发出的入邻居的消息2) 计算当前顶点的值3) 向出邻居发消息 1.接收入邻居的消息 2.求入邻居的最小值,加上顶 ...
- C#利用资源文件设置软件自适应多语言
在项目更目录下添加两个资源文件,以适应中英文两种版本,如Resource.zh_CN.resx和 Resource.en-US.resx ,两个资源文件的ID都一样,值分别配置相应的中英文 ...