java try finally return 顺序,finally一定会执行吗?

结论:
finally至少有两种情况不会被执行。
‌try语句没有被执行到。比如在try之前就返回了。
‌try块中使用了System.exit(0),这个语句会导致JVM退出

其他说明:
‌try块中有return,执行到该语句,会执行return的表达式,但是并不会直接返回,而是等finally块执行完才返回,所以finally块会在return(包括本身)之前的所有语句执行完再执行。
‌如果finally块中有return会覆盖try块中的return,此时如果存在finally后面的语句(包括return)都不可达。
‌当try-finally中有return语句,其外的return只有在发生异常时才起作用,所以并非不可达
‌在finally块中改变了return的变量,如果是基本类型更改无效(包括引用类型的置空操作)
‌如果发生异常会先执行catch块。如果中也有return,会同try的情况一样,会被finally的return覆盖

测试用例:

import java.util.HashMap;
import java.util.Map;

public class ReturnTest {

    public static void main(String[] args) {
        System.out.println("try块中语句没有被执行:");
        System.out.println(nonexetry());

        System.out.println("finally块中有return语句:");
        System.out.println(directReturn());

        System.out.println("finall块中改变了return的值(基础变量):");
        System.out.println(changeReturnValue1());

        System.out.println("finall块中改变了return的值(String变量):");
        System.out.println(changeReturnValue2());

        System.out.println("finall块中改变了return的值(非String的引用变量):");
        System.out.println(changeReturnValue3().get("name"));
    }

    private static String exitIntry() {
        try {
            System.exit(0);
        } finally {
            return "cgz";
        }
    }

    private static String nonexetry() {
        if (25 > 3)
            return "before try";
        try {
            return "in try";
        } finally {
            return "in finally";
        }
    }

    private static Map changeReturnValue3() {
        Map<String, Object> map = new HashMap();
        map.put("name", "cgz");
        try {
            return map;
        } finally {
            map.put("name", "abc");
        }
    }

    private static String changeReturnValue2() {
        String s = "cgz";
        try {
            return s;
        } finally {
            s = "abc";
        }
    }

    private static boolean changeReturnValue1() {
        boolean b = true;
        try {
            return b;
        } finally {
            b = false;
        }
    }

    private static boolean directReturn() {
        try {
            return true;
        } finally {
            return false;
        }
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值