今天遇到一个非常有趣的题目,关于Java中try和finally中有return的区别和执行顺序。可以说是让我刷新了知识面。
首先来说说Java中的异常处理:
通过try catch块进行异常的捕获跟处理。语法:
try{
代码
}catch(异常类型 e){
发生了异常1,进行处理。
}catch(异常类型 e){
发生了异常2,进行处理。
}...
try
块中写编写可能产生异常的代码。
catch
块中用来表示发生了异常,如何进行处理的逻辑。
finally代码块
语法:
try{
代码
}catch(异常类型 e){
发生了异常1,进行处理。
}catch(异常类型 e){
发生了异常2,进行处理。
}...
fianlly{
一定会执行的代码
}
finally
中的代码无论是否异常都会执行,return也无法阻止,除非使用System.exit(1);
退出虚拟机。finally
也不能单独使用。
而我今天遇到的是try-finally块
try{
代码
}fianlly{
一定会执行的代码
}
大家觉得下面的代码返回值是多少
public static void main(String[] args) {
System.out.println(a());
}
public static int a(){
int b =3;
try {
b=2;
return b;
}finally {
b=1;
}
}
}
肯定有人觉得是2,有人觉得是1对吧。
正确答案是2,不信你可以自己去跑跑;
如果换成下面的代码了,输出结果又是什么?
public static Integer a(){
Integer b=3000;
try {
b=2000;
return b;
}finally {
b=1000;
}
}
有人觉得是2000,有人觉得是1000对吧。
这个正确答案是2000;
现在你们肯定觉得输出结果都是try里面的值吧,那下面一个代码了?
public static String a(){
HashMap<String, String> map = new HashMap<String, String>();
map.put("1","3");
try {
map.put("1","2");
return map.get("1");
}finally {
map.put("1","1");
}
}
大部分人肯定觉得会是1,我告诉你还是2;
最后一个代码了
public static HashMap<String, String> a(){
HashMap<String, String> map = new HashMap<String, String>();
map.put("1","3");
try {
map.put("1","2");
return map;
}finally {
map.put("1","1");
}
}
这个结果又是什么了?
正确答案是1,finally的修改终于有作用了
大家觉得这是为什么了?
总结一下:
1.try中有return,但是finally中无return,但是finally中有代码,这个时候finally的代码会执行。
如果try中return返回的是对象,在finally中的代码对return返回的对象修改,return返回的值是修改后的值。
如果try中return返回的是基本数据类型,在finally中的代码对return返回的基本数据类型修改,try中return的值不会被改变。integer是会自动拆箱,return出的值是基本数据类型。
2.try中有return,finally中也有return,这个时候,无论返回的是什么数据类型,结果都是返回finally中return的内容。
如果有不对的地方希望大家指正出来,我会虚心接受,以上都是我个人看法。