当try、catch中有return时,finally中的代码会执行么?
今天,看到一个面试题:
try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?
我们用代码来验证下:
public static void main(String[] args) {
System.out.println("我是输出结果a:" + test1()); public static int test1() {
int a = 5;
try {
System.out.println(a / 0);
a = 10;
} catch (ArithmeticException e) {
System.out.println("我是catch中的a:" + a);
return a = 20;// 程序执行到这时,a=20已经执行完,准备好返回结果了,发现有finally,则在去执行finally
} finally {
System.out.println("我是finally中未重定义的a:" + a);
a = 30;
System.out.println("我是finally中重定义过的a:" + a);
}
return a;
}
运行结果:
我是catch中的a:5
我是finally中未重定义的a:20
我是finally中重定义过的a:30
我是输出结果a:20
从结果中可看出:即使catch中return了,finally中的代码还是会执行。但是有个问题,明明结果显示,经过finally代码的执行,a已经是30了,返回结果为什么还是20?
我们再执行另外代码:
public static void main(String[] args) {
System.out.println("我是输出结果a:" + test1()); } public static int test1() {
int a = 5;
try {
System.out.println(a / 0);
a = 10;
} catch (ArithmeticException e) {
System.out.println("我是catch中的a:" + a);
return a = 20;// 程序执行到这时,a=20已经执行完,准备好返回结果了,发现有finally,则在去执行finally
} finally {
System.out.println("我是finally中未重定义的a:" + a);
a = 30;
System.out.println("我是finally中重定义过的a:" + a);
return a = 30;
}
}
运行结果:
我是catch中的a:5
我是finally中未重定义的a:20
我是finally中重定义过的a:30
我是输出结果a:30
我们会发现,如果finally中有return,结果会根据finally中的结果返回,如果finally中没有return,结果会按照catch的结果返回,但是不管怎么样,都是会执行finally的代码。
前面的例子是基本类型的,那我们看下引用类型是不是也这样:
public static User getName1(){
User user = null;
try {
user = new User("张三");
throw new Exception();
} catch (Exception e) {
user = new User("李四");
return user;
} finally {
user = new User("王五");
//return user;
}
}
结果
User [name=李四]
再试下其他:
public static User getName1(){
User user = null;
try {
user = new User("张三");
throw new Exception();
} catch (Exception e) {
user = new User("李四");
return user;
} finally {
user = new User("王五");
return user;
}
}
结果:
User [name=王五]
额。。。。。。引用类型类型好像也是这样的。
我们再看看:
public static User getName2(){
User user = null;
try {
user = new User("张三");
throw new Exception();
} catch (Exception e) {
user.setName("李四");
return user;
} finally {
user.setName("王五");
//return user;
}
}
结果如下:
User [name=王五]
额。。。。好像不对啊,不应该是李四吗?
public static User getName2(){
User user = null;
try {
user = new User("张三");
throw new Exception();
} catch (Exception e) {
user.setName("李四");
return user;
} finally {
user.setName("王五");
return user;
}
}
结果:
User [name=王五]
引用类型好像有问题啊。。。。
其实可以这么理解:执行完catch内的代码后,会把结果值暂时保存,然后执行finally中的代码,如果finally中没有return,则直接把保存的值返回。如果finally中有return,则值会被finally改变,再返回。
而如果finally中没有return,返回的值好像也有部分出乎我们的意料。可以这样理解吧,catch中的结果值会被final修饰,当final修饰一个基本数据类型时,表示该基本数据类型的值一旦在初始化后便不能发生变
化;如果final修饰一个引用类型时,则在对其初始化之后便不能再让其指向其他对象了,但该引用所指向的对象的内容是可以发生变化的。
就那下面代码来说明:
User u1 = new User("张三");
User u2 = new User("李四");
final User u3 = u1;
u3 = u2;//这行代码会报编译错误
System.out.println(u3);
u1.setName("王五");
System.out.println(u3);
第四行代码会报编译错误:The final local variable u3 cannot be assigned. It must be blank and not using a compound assignment
说明final修饰的不能改变引用对象,但是引用对象u1的值变化还是可以。
上面的代码执行下:
User [name=张三]
User [name=王五]
现在可以看出 上面的代码 user.setName("王五");和user = new User("王五"); 执行的结果为什么会不一样,因为setname改变的是引用所指向的对象的内容,是可以的。= new User("王五"); 是改变了引用指向,是不可以的。
当try、catch中有return时,finally中的代码会执行么?的更多相关文章
- Java中try、finally语句中有return时的执行情况 [转]
原文:http://kingj.iteye.com/blog/1436761 在Java中当try.finally语句中包含return语句时,执行情况到底是怎样的,finally中的代码是否执行,大 ...
- try catch finally ,try 中有return时怎么执行
- 如果try中有return那么finally中不要有return不然不会执行try中的return
public class TryExer { public static void main(String[] args) { String test = test(); System.out.pri ...
- trycatch之catch对捕获异常的处理及后续代码的执行的探索
工作时,一直对try块中throw的异常对象,在catch中如何处理此异常,以及trycatchfinally完毕,程序是否就此停止还是继续运行很迷惑,于是参考网上的资料,自己写了些demo,去慢慢探 ...
- java中的代码块执行顺序
/* 代码块:在Java中,使用{}括起来的代码被称为代码块. 根据其位置和声明的不同,可以分为 局部代码块:局部位置,用于限定变量的生命周期. 构造代码块:在类中的成员位置,用{}括起来的代码.每次 ...
- iframe中插入代码并执行
最近有需求通过iframe插入代码.有蛮多方法,如下: 1 var iframe = document.getElementById('previewUrl'); 2 iframe.src = 'ab ...
- try、finally代码块有无return时的执行顺序
结论: 1.不管有没有出现异常,finally块中代码都会执行:2.当try和catch中有return时,finally仍然会执行:3.finally是在return后面的表达式运算后执行的(此时并 ...
- 有return语句情况下,try-catch-finally的执行顺序
重要结论: 1.不管有没有出现异常,finally块中代码都会执行 2.当try和catch中有return时,finally仍然会执行 3.finally是在return后面的表达式运算后执行的(此 ...
- java中return在Try-Catch中的执行顺序
我们知道return会结束此方法并返回指定值.以及在Try-catch-finally中无论try代码块中有没有异常finally中的代码时都会被执行的.但是如果return包含在try-catch- ...
随机推荐
- IT技术人,“三十而已”
最近电视剧<三十而已>热播,我家的电视机自然也是被霸屏,我还是跟着妹纸看了看,开头和结局完整看完,中间看了一点,大部分都是在微信公众号上通过别人的文章看完的.我个人也已经30+了,今天也和 ...
- Android 本地缓存Acache的简单使用
设置缓存数据: ACache mCache = ACache.get(this); mCache.put("key1", "value"); //保存6秒,如果 ...
- 数据结构与算法笔记(java)目录
数据结构: 一个动态可视化数据结构的网站 线性结构 数组 动态数组 链表 单向链表 双向链表 单向循环链表 双向循环链表 栈 栈 队列 队列 双端队列 哈希表 树形结构 二叉树 二叉树 二叉搜索树 A ...
- eclipse项目文件夹整理
1.点击倒三角 2.系统默认为Projects,选择第二个working sets 3.点击Configure Working Sets,点new 4.点击后,选中点Add 5.添加一个名字,Fins ...
- Docker商业版受限,胖容器是个选择
前情概要 8月13日,Docker 公司更新了网站服务协议,条款申明,禁止禁运国家和被列入「美国实体清单」的组织和个人使用带有该服务协议链接的 Docker 网站和所有相关网站.这一更新协议迅速引起了 ...
- NOIP2007 树网的核 [提高组]
题目:树网的核 网址:https://www.luogu.com.cn/problem/P1099 题目描述 设 T=(V,E,W)T=(V,E,W) 是一个无圈且连通的无向图(也称为无根树),每条边 ...
- 可爱的python
可爱的python 作者: 哲思社区出版社: 电子工业出版社 优点 1. 案列讲解很详细,前几章的内容恰好是我想要了解的,例如利用python os模块读取磁盘的文件,或者获得文字的编码方式.这些内 ...
- mac安装conda后,终端的用户名前面有一个(base),最佳解决方案
mac安装了conda后,前面会有一个(base),很烦人,终于找到最佳解决方案了: $ conda config --set auto_activate_base false 原因: 安装conda ...
- MySQL遇见SELECT list is not in GROUP BY clause and contains nonaggre的问题
目录 报错现象 原因 解决方法 报错现象 执行SQL报错如下: SELECT student.s_no,student.s_name,SUM(result.mark) FROM student,res ...
- JavaScript函数的高级用法
1.函数的定义和调用 1.1函数的定义方式 方式1 函数声明方式 function 关键字 (命名函数) function fn(){} 方式2 函数表达式(匿名函数) var fn = functi ...