java基础之try...catch...finally 模块中return的执行顺序

关于try…catch…block

今天看到一个特别的例子,刷新了我对trycatch的认知,本文章默认认为具有try模块相关基础的知识,分享给大家一起学习!

// 代码一
public int test1() {
        int num = 10;
        try {
            num += 10;
            return num;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            num = 100;
        }
        return num;
    }


// 代码二
    public int test2() {
        Num nu = new Num();
        try {
            nu.num += 10;
            return nu.num;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            nu.num = 100;
        }
        return nu.num;
    }
    
	class Num {
	    int num = 10;
	}
// 代码三
  public Num test3() {
        Num nu = new Num();
        try {
            nu.num += 10;
            return nu;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            nu.num = 100;
        }
        return nu;
    }
    
	class Num {
	    int num = 10;
	}
    public static void main(String[] args) {
        Test o = new Test();
        int test1 = o.test1();
        int test2 = o.test2();
        int test3 = o.test3().num;
        System.out.println(test1);
        System.out.println(test2);
        System.out.println(test3);
    }

大家心中有没有一个答案?

这边也不卖关子了,没错,是 20 , 20,100

其实我一开始看到这个题的话,第一个感觉就是100, 100, 100, 因为不管什么时候return,finally内的语句是一定会执行的, 所以值都应该是100,但是这边是存在问题的,类似于Java中值传递和引用传递.

此时此刻, 我的内心是这样的。。。

java基础之try...catch...finally 模块中return的执行顺序_第1张图片

// 注:此处的返回值是bbb  有疑问可以自己复制跑一下
    public String test4() {
        String s = "aaa";
        try {
            s = "bbb";
            return s;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            s = "ccc";
        }
        return s;
    }

总结一下吧:

存在finally 的try 模块中:
1.如果return 的是基本数据类型或者字符串, 那 finally中模块对返回值的修改是不起作用的;
2.同样,如果是引用类型,那么值就是最后finally 中修改后的值。

你可能感兴趣的:(Javabase,java)