java finally 赋值问题返回探讨

1、基本数据类型

​
public class BasicDataType {
    public static void main(String[] args) {
        System.out.println(basicDataType());
    }
    public static int basicDataType() {
        int i = 0;
        try {
            i = 1;
            return i;
        } finally {
            i = 2;
        }
    }
}

​

jvm编译后代码:

public class BasicDataType {
    public BasicDataType() {
    }

    public static void main(String[] args) {
        System.out.println(basicDataType());
    }

    public static int basicDataType() {
        boolean var0 = false;

        byte var1;
        try {
            int i = 1;
            var1 = i;
        } finally {
            var0 = true;
        }

        return var1;
    }
}

运行结果为:

 2、String类型

public class StringType {
    public static void main(String[] args) {
        System.out.println(testStringType());
    }

    public static String testStringType() {
        String t = "init";
        try {
            t = "try";
            return t;
        } finally {
            t = "finally";
        }
    }
}

jvm编译后代码:

public class StringType {
    public StringType() {
    }

    public static void main(String[] args) {
        System.out.println(testStringType());
    }

    public static String testStringType() {
        String t = "init";

        String var1;
        try {
            t = "try";
            var1 = t;
        } finally {
            t = "finally";
        }

        return var1;
    }
}

运行结果为:

3、引用类型

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Person {
    private String name;

    private Integer age;
}

 

public class ReferDataType {
    public static void main(String[] args) {
        System.out.println("test1:" + test1 ());
        System.out.println("test2:" + test2 ());
        System.out.println("test3:" + test3 ());
    }

    public static List<Person> test1 () {
        List<Person> list = new ArrayList<>();
        try {
            Person p1 = new Person("张三",20);
            Person p2 = new Person("李四",30);
            Person p3 = new Person("王五",0);
            list.add(p1);
            list.add(p2);
            list.add(p3);
            return list;
        } finally {
            list = list.stream().filter(item -> item.getAge() > 0).collect(Collectors.toList());
            System.out.println("test1 ()方法内:" + list);
        }
    }

    public static List<Person> test2 () {
        List<Person> list = new ArrayList<>();
        try {
            Person p1 = new Person("张三",20);
            Person p2 = new Person("李四",30);
            list.add(p1);
            list.add(p2);
            return list;
        } finally {
            Person p3 = new Person("王五",0);
            list.add(p3);
        }
    }

    public static Person test3 () {
        Person p = new Person();
        try {
            p.setName("张三");
            p.setAge(20);
            return p;
        } finally {
            p.setAge(40);
        }
    }
}

jvm编译后代码:

public class ReferDataType {
    public ReferDataType() {
    }

    public static void main(String[] args) {
        System.out.println("test1:" + test1());
        System.out.println("test2:" + test2());
        System.out.println("test3:" + test3());
    }

    public static List<Person> test1() {
        ArrayList list = new ArrayList();

        ArrayList var4;
        try {
            Person p1 = new Person("张三", 20);
            Person p2 = new Person("李四", 30);
            Person p3 = new Person("王五", 0);
            list.add(p1);
            list.add(p2);
            list.add(p3);
            var4 = list;
        } finally {
            List<Person> list = (List)list.stream().filter((item) -> {
                return item.getAge() > 0;
            }).collect(Collectors.toList());
            System.out.println("test1 ()方法内:" + list);
        }

        return var4;
    }

    public static List<Person> test2() {
        ArrayList list = new ArrayList();
        boolean var8 = false;

        ArrayList var3;
        try {
            var8 = true;
            Person p1 = new Person("张三", 20);
            Person p2 = new Person("李四", 30);
            list.add(p1);
            list.add(p2);
            var3 = list;
            var8 = false;
        } finally {
            if (var8) {
                Person p3 = new Person("王五", 0);
                list.add(p3);
            }
        }

        Person p3 = new Person("王五", 0);
        list.add(p3);
        return var3;
    }

    public static Person test3() {
        Person p = new Person();

        Person var1;
        try {
            p.setName("张三");
            p.setAge(20);
            var1 = p;
        } finally {
            p.setAge(40);
        }

        return var1;
    }
}

运行结果为:

总结:

如果是返回基本类型的值,那么在缓存时也是缓存值本身,所以后面在finally块中重新赋值时,方法返回的值不会受finally块中重新赋值的影响;

如果返回的是引用类型的值,那么在缓存时,缓存的是引用类型对象的引用,所以虽然后面在finally块中重新赋值时(重新指向另一个对象),方法返回的值不会受到影响,但是如果是修改对象的属性,那么会影响到返回的值。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值