理清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 ...
随机推荐
- 2019-2020 ICPC, NERC, Northern Eurasia Finals
A. Apprentice Learning Trajectory rdc乱编的做法 考虑贪心,每次会选择结束时间最早的. 设当前时间为 \(x\),那么可以区间有两类 a) \(l_i \leq x ...
- OpenLiveWriter博客工具
1.OpenLiveWriter安装 官网下载地址:http://openlivewriter.org/ 默认安装到:C:\Users\用户\AppData\Local\OpenLiveWriter目 ...
- linux段位进阶
1.青铜: 1.Linux基础知识.基本命令(起源.组成.常用命令如cp.ls.file.mkdir等常见操作命令) 2.Linux用户及权限基础 3.Linux系统进程管理进阶 4.linux高效文 ...
- Python3批量修改指定目录下面的图片/文件名
需求: 从网上下载的N张.png图片保存到image目录中,将下载下来的图片全部重命名test1.png/test2.png... 实现代码: 目录结构: config-->setting.py ...
- Hive HA基本原理
- c++11 Thread库写多线程程序
一个简单的使用线程的Demo c++11提供了一个新的头文件<thread>提供了对线程函数的支持的声明(其他数据保护相关的声明放在其他的头文件中,暂时先从thread头文件入手吧),写一 ...
- vue项目 上传到git
1. git add . 效果: 2. git commit -m '' 3. git push 效果: 4.在码云上就可以看到修改啦 2018-05-19 08:52:52
- js实现点击空白处隐藏
部分业务要求除了某元素外点击其他对象,对应的元素隐藏,下面是一个demo效果, <!DOCTYPE html> <html> <head> <meta cha ...
- Java带头节点单链表的增删合并以及是否有环
带头节点单链表 1.优势: 1)当链表为空时,指针指向头结点,不会发生null指针异常 2)方便特殊操作(删除第一个有效节点或者插入一个节点在表头) 3)单链表加上头结点之后,无论单链表是否为空,头指 ...
- phonegap 开发指南系列----开始之前(1)
在基于任何平台(安卓.ios等phonegap支持的平台)上做phonegap开发之前,需要安装 cordova 的 command-line interface (CLI) .CLI详细:http: ...