Java中try和finally中有return的区别和执行顺序

今天遇到一个非常有趣的题目,关于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的内容。

如果有不对的地方希望大家指正出来,我会虚心接受,以上都是我个人看法。
 


版权声明:本文为qq_53551331原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。