1.首先,不管try...catch是否有异常或者有return,只要有finally,都是要执行的

2.当try有return 语句,没有产生异常时,执行到return语句时,会先算出return 表达式的值,并将其保存起来。注意,此时没有返回,只是计算表达式的值并保存起来,然后再去执行finally代码块,如果finally代码块有return 语句,程序执行到return语句,程序会提前结束,然后返回值,不会去执行try中的return

例如 try 中 有return a+b ,执行到这里只是将a+b的值保存起来。然后再去执行finally ,finally有return a+c ,那么程序执行到return a+c时,便会返回a+c的结果,不会再去执行try中的return.

3.当try有异常,catch有return语句时,程序执行到try中有异常的地方,异常被捕获,跳转到catch代码块,执行到return语句时,同样只是保存return 表达式的值,然后再去执行finally代码块。

4、如果return的数据是引用数据类型,而在finally中对该引用数据类型的属性值的改变起作用,try中的return语句返回的就是在finally中改变后的该属性的值。

5、finally代码中最好不要包含return,程序会提前退出,也就是说返回的值不是try或catch中的值

看完上面,如果还不理解,执行下面代码,一个一个去验证,都是能理解的

public class TryCatchTest {

    public static void main(String[] args) {
//	System.out.println("return的返回值:" + test());
	System.out.println("包含异常return的返回值:" + testWithException());
//       System.out.println("return的返回值:" + testWithObject().age); // 测试返回值类型是对象时
    }

    // finally是在return后面的表达式运算之后执行的,此时并没有返回运算之后的值
    //,而是把值保存起来,不管finally对该值做任何的改变,返回的值都不会改变,依然返回保存起来的值。
    //也就是说方法的返回值是在finally运算之前就确定了的。
    static int test() {
        int x = 1;
        try {
            return x++;

        } catch(Exception e){

        }finally {
            System.out.println("finally:" + x);//finally =2, 说明 try中return 后的表达式x++执行了
            ++x;
            System.out.println("++x:" + x);//x=3




             return x;  //执行到这里,程序便结束,此时返回的值为3,即test()执行结果为3 。说明try中return不会被执行
            
//编译器把finally中的return语句标识为一个warning. 警告为'return' inside 'finally' block
            //Inspection info: Reports return statements inside of finally blocks.
            //While occasionally intended, such return statements may mask thrown exceptions and complicate debugging.

//            翻译为中文
//            'finally'块中的'return'
//            检查信息:报告finally块内部的返回语句。
//            虽然偶尔是有意的,但这样的返回语句可能会掩盖抛出的异常并使调试复杂化。
//            所以 finally代码中最好不要包含return.


        }

    }

    static int testWithException(){
        Integer x = null;
        try {
            x.intValue(); // 造个空指针异常
            return x++;
        } catch(Exception e){
            e.printStackTrace();
            System.out.println("catch:" + x);// x=null
            x = 1;
            return x; // 返回1
//			return ++x; // 返回2
        }finally {
            x = 1;
            System.out.println("finally:" + x);
            ++x;
            System.out.println("++x:" + x);
            // finally代码中最好不要包含return,程序会提前退出,
            // 也就是说返回的值不是try或catch中的值
			 return x;
        }
    }

    static Num testWithObject() {
        Num num = new Num();
        try {
            return num;
        } catch(Exception e){

        }finally {
            num.age++; // 改变了引用对象的值
            System.out.println("finally:" + num.age); //num.age=1
         
        }
        return num;
    }

    static class Num{
        public int age;
    }

}