理清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 ...
随机推荐
- spark集群进入 bin 下面目录./spark-shell 出现Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
spark集群启动的时候可以正常,进入 ./spark-shell 就会出现如下错误 配置文件:spark-env.sh export JAVA_HOME=/usr/java/jdk1.7.0_51e ...
- Error: setup script specifies an absolute path
在安装sklearn的时候,出现: error: Error: setup script specifies an absolute path: /opt/xgboost-0.47/python-pa ...
- JPA Query in 集合
使用 :param的方式来传递参数,下面举个例子 @PersistenceContext EntityManager em @Override public List<Map> ...
- grunt完整的配置demo
const path = require('path') const fs = require('fs'); module.exports = function (grunt) { grunt.reg ...
- Python学习笔记(五)——异常处理
Python 异常总结 异常名称 解释 AssertionError 断言语句(assert)失败:当assert关键字后边的条件为假时,程序将抛出该异常,一般用于在代码中置入检查点 OSError ...
- leetcood学习笔记-2-两数相加
题目描述: 方法一: # Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.va ...
- php 三种文件下载的实现
第一种:直接添加文件下载的绝对路径连接 //如:我有一个文件在demo.xx.cn/demo.zip <button> <a href = "http://demo.xx. ...
- ForkJoin学习笔记
1.Fork/Join框架:(分治算法思想) 在必要的情况下,将一个大任务,进行拆分(fork) 成若干个子任务(拆到不能再拆,这里就是指我们制定的拆分的临界值),再将一个个小任务的结果进行join汇 ...
- 阿里云在云栖大会发布RPA最新3.4版本,将与达摩院联合探索人工智能领域
9月26日,在2019年杭州云栖大会上,阿里云发布了RPA最新V3.4版本,全新升级了增加诸如录屏审计.JAVA应用录制能力.达摩院OCR内置组件.语法检查与智能提示能力增强等功能. RPA全名称Ro ...
- vue+Iview+gulp 生成文档说明
1.安装npm gulp相关插件 比如:gulp.gulp-concat.gulp-htmlmin.gulp-cssmin.gulp-cheerio.gulp-clean 2. 编写gulpfile. ...