finally和return对变量的影响

结论:

  1. 当finally中没有return,但是try中有return时

    1)当finally调用的任何可变API,会修改返回值;
    2)当finally调用任何的不可变API,对返回值没有影响。

  2.   当finally中有return,直接返回finally中的变量,不返回try中的变量

 

  • 可变API:如 对象,StringBuilder 这样的内部对象可变的API,
  • 不可变可变API:如基本类型int,包装类型Integer,String类型

String底层的数组是用final修饰的,是一个数组常量,而StringBuilder底层用来接收存储字符的数组是一个变量.所以前者在创建之后是没法更改,而后者可以)

原理参考:https://blog.csdn.net/weixin_41005006/article/details/80643681

 

测试样例:

当finally中没有return,但是try中有return时

int testInt() {
        int x = 0;
        try {
            x++;
            return x;
        } finally {
            x++;
        }
    }


    String testString() {
        String x = "";
        try {
            x = x + "hello";
            return x;
        } finally {
            x = x + "world";
        }
    }

    Integer testInteger() {
        Integer in = new Integer(0);
        try {
            in = 1;
            return in;
        } finally {
            in = new Integer(3);
        }
    }

    User testObject() {
        User user = new User(0);
        try {
            user.age = 1;
            return user;
        } finally {
            user.age = 3;
        }
    }

当finally中有return

int testInt_return() {
        int x = 0;
        try {
            x++;
            return x;
        } finally {
            x++;
            return x;
        }
    }


    String testString_return() {
        String x = "";
        try {
            x = x + "hello";
            return x;
        } finally {
            x = x + "world";
            return x;
        }
    }

    Integer testInteger_return() {
        Integer in = new Integer(0);
        try {
            in = 1;
            return in;
        } finally {
            in = 3;
            return in;
        }
    }

    User testObject_return() {
        User user = new User(0);
        try {
            user.age = 1;
            return user;
        } finally {
            user.age = 3;
            return user;
        }
    }

执行结果:

public static void main(String[] args) {
        System.out.println("testInt:\t" + new Main().testInt());
        System.out.println("testString:\t" + new Main().testString());
        System.out.println("testInteger:\t" + new Main().testInteger());
        System.out.println("testObject:\t" + new Main().testObject().age);
        System.out.println("----finally含return---");
        System.out.println("testInt_return:\t" + new Main().testInt_return());
        System.out.println("testString_return:\t" + new Main().testString_return());
        System.out.println("testInteger_return:\t" + new Main().testInteger_return());
        System.out.println("testObject_return:\t" + new Main().testObject_return().age);
    }
testInt:	1
testString:	hello
testInteger:	1
testObject:	3
----finally含return---
testInt_return:	2
testString_return:	helloworld
testInteger_return:	3
testObject_return:	3

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值