当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- ...
随机推荐
- TCL(事务控制语言)
#TCL/*Transaction Control Language 事务控制语言 事务:一个或一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行. 案例:转账 张三丰 1000 ...
- nvm -- node 多版本管理器
Node.js 越来越热,应用的场景也越来越多. 在开发中,我们可能同时在进行多个 node 项目,而这些不同的项目所使用的 node 版本又是不一样的,或者是要用更新的 node 版本进行试验和学习 ...
- 区块链入门到实战(37)之Solidity – 循环语句
与其他语言类似,Solidity语言支持循环结构,Solidity提供以下循环语句. while do ... while for 循环控制语句:break.continue. Solidity – ...
- Mysql探索之索引详解,又能和面试官互扯了~
前言 索引是什么?有什么利弊?一旦在面试中被问道,对于新入门的小白可能是个棘手的问题. 本篇文章将会详细讲述什么是索引.索引的优缺点.数据结构等等常见的知识. 什么是索引 索引就是一种的数据结构,存储 ...
- 模型层中QuerySet的学习
创建对象 使用关键字参数实例化模型实例来创建一个对象,然后调用save()把它保存到数据库中 pub_obj = models.Publisher(title='奥利给出版社') pub_obj.sa ...
- Java开发之javaEE(java2EE)的介绍,java软件工程师初步阶段知识
1. 为什么需要JavaEE 我们编写的JSP代码中,由于大量的显示代码和业务逻辑混淆在一起,彼此嵌套,不利于程序的维护和扩展.当业务需求发生变化的时候,对于程序员和美工都是一个很重的负担. 为了程序 ...
- SSD-Tensorflow 512x512 训练配置
搞了几天终于把这个给搞得差不多了,遇到的错误这里也记录一下: 一.配置[配置什么的300和512其实差不多,这里只举一个例子来分析一下] 之前的文件修改什么的和300x300的一样:https://w ...
- python小白入门基础(一:注释)
# 注释:就是对代码的解释,方便大家阅读代码.注释后的代码程序不会执行.# 注释的分类:单行注释和多行注释# (1)单行注释# 在代码前面加个#字符print("hello world&qu ...
- istio部署
Istio的部署介绍 目录 Istio的部署介绍 部署模型 集群模式 单集群 多集群 网络模型 单网络 多网络 控制面模型 身份和信任模型 网格中的信任 网格之间的信任 网格模型 单网格 多网格 租户 ...
- oracle无法通过ip地址连接
问题描述:使用plsql可以连接本地oracle实例,但telnet 192.168.130.71 (内网ip)不通. 其实在11g安装完成后,默认网络配置 listener.ora中 host = ...