理清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 ...
随机推荐
- c++11新特性学习2
noexcept 替代 throw.优点是更安全, 如果noexcept 修饰的函数抛出了异常,编辑器可以直接选择终止程序. C++ 11中析构函数默认为noexcept(true),从而阻止异常的扩 ...
- class11_messagebox 弹窗
最终的运行效果图(程序见序号2) #!/usr/bin/env python# -*- coding:utf-8 -*-# -------------------------------------- ...
- 可搭建SS服务上网的不限流量VPS推荐
https://itldc.com/en,7个机房,推荐指数:★★★★ 1995年运作至今,有多个机房,包括:新加坡.洛杉矶.新泽西.立陶宛.乌克兰.保加利亚.荷兰.VPS特征: KVM虚拟(支持BB ...
- 完美解决 IE6 position:fixed 固定定位问题
关于 position:fixed; 属性 生成绝对定位的元素,相对于浏览器窗口进行定位. 元素的位置通过 “left”, “top”, “right” 以及 “bottom” 属性进行规定. pos ...
- php连接docker启动的mysql容器报错:(HY000/2002): Connection refused的解决办法
vim libraries/config.default.php 查找到localhost/127.0.0.1字符[一般来说默认都是localhost] :/localhost 替换成容器名,例如我定 ...
- 随笔-ansible-2
通过Ansible来搭建一套Web服务架构.[以AD-HOC的形式] Inventory文件内容如下: [proxy] 192.168.40.254 [app] 192.168.40.243 [nos ...
- 免费的高分辨率图库——re:splashed 可用做网页背景、设计或桌面壁纸
想找高清图片用作网站背景.设计或桌面壁纸?可以去re:splashed看看.re:splashed 是一个提供免费高分辨率HD图片的网站,有多种分类标签,查找很方便,无需注册和登陆便可下载. 网站名称 ...
- arm-linux-gcc 的使用
1. 编译 C 文件,生成 elf 可执行文件 h1.c 源文件 #include <stdio.h> void hellofirst(void) { printf("The f ...
- 数据库MySQL--修改数据表
创建数据库::create database 数据库名: 如果数据不存在则创建,存在不创建:Create database if not exists 数据库名 ; 删除数据库::drop datab ...
- sql (12) HAVING
HAVING 子句在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与合计函数一起使用. 新建表 StudentSS_id Grade Name phone1 98 小明 12345 ...