Java语法:finally中修改返回结果

本文通过实例代码详细分析了Java中finally块对return语句的影响,包括finally中的return覆盖try中的return、finally中改变返回值的情况以及对引用类型对象属性的影响。展示了finally在不同情况下如何处理返回值。
摘要由CSDN通过智能技术生成

Java的try语句在返回前将其他所有的操作执行完,保留好要返回的值,而后转入执行finally中的语句,而后分为以下三种情况:

  • 如果finally中有return语句,则会将try中的return语句”覆盖“掉,直接执行finally中的return语句。
  • 如果finally中没有return语句,也没有改变要返回值,则执行完finally中的语句后接着执行try中的return语句。
  • 如果finally中没有return语句,但是改变了要返回的值,分以下两种情况:
    • 如果return的是基本数据类型或引用类型,则在finally中对值或引用的改变不起作用,try中的return语句依然会返回之前保留的值。
    • 如果return的是引用类型,而在finally中修改该引用类型的属性值,try中return语句返回的对象,属性值是finally中改变后的属性值。
public class FinallyReturnTest {
    public static void main(String[] args) {
        try {
            System.out.println(finallyReturnBasic());     // 2
            System.out.println(finallyReturnString());    // Change me!
            System.out.println(finallyReturnReference()); // innerB

            System.out.println(finallyChangeBasic());     // 1
            System.out.println(finallyChangeString());    // Hello World!
            System.out.println(finallyChangeReference()); // innerA
            System.out.println(finallyChangeAttribute()); // innerB
        } catch (Exception e) {
            System.out.println(e);
        }
    }

    public static int finallyReturnBasic() throws Exception {
        int input = 1;

        try {
            return input;
        } catch (Exception e) {
            throw new Exception("test exception");
        } finally {
            return 2;
        }
    }

    public static String finallyReturnString() throws Exception {
        String input = "Hello World!";

        try {
            return input;
        } catch (Exception e) {
            throw new Exception("test exception");
        } finally {
            return "Change me!";
        }
    }

    public static Inner finallyReturnReference() throws Exception {
        Inner inner = new Inner("innerA");
        try {
            return inner;
        } catch (Exception e) {
            throw new Exception("test exception");
        } finally {
            return new Inner("innerB");
        }
    }

    public static int finallyChangeBasic() throws Exception {
        int input = 1;

        try {
            return input;
        } catch (Exception e) {
            throw new Exception("test exception");
        } finally {
            input = 2;
        }
    }

    public static String finallyChangeString() throws Exception {
        String input = "Hello World!";

        try {
            return input;
        } catch (Exception e) {
            throw new Exception("test exception");
        } finally {
            input = "Change u!";
        }
    }

    public static Inner finallyChangeReference() throws Exception {
        Inner inner = new Inner("innerA");
        try {
            return inner;
        } catch (Exception e) {
            throw new Exception("test exception");
        } finally {
            inner = new Inner("innerB");
        }
    }

    public static Inner finallyChangeAttribute() throws Exception {
        Inner inner = new Inner("innerA");
        try {
            return inner;
        } catch (Exception e) {
            throw new Exception("test exception");
        } finally {
            inner.setName("innerB");
        }
    }
}

class Inner {
    private String name;

    public Inner(String name) {
        this.name = name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return name;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值