用代码的方式可能比较直观,虽然比较粗糙,但是有用!

package com.test;

import java.util.ArrayList;
import java.util.List;

public class testException {
    /**
     * 主要探究try catch finally中的实际应用
     * */

    public static void main(String[] args) {
        //执行第一种情况
//        int i1_return = testReturn1();
//        System.out.println("i1_return : "+i1_return);
        //执行第二种情况
//        int i2_return = testReturn2();
//        System.out.println("i2_return : "+i2_return);
        //执行第三种情况
//        int i3_return = testReturn3();
//        System.out.println("i3_return : "+i3_return);

        //执行第四种情况
        List list_return = testReturn4();
        System.out.println("list_return : "+list_return);

    }

    static int testReturn1(){
        //1、try中有return ,catch中无异常可捕获
            //执行结果为:
                /**
                 * 运行结果:
                 * try : 2
                 * finally : 3
                 * i_return : 2
                 * 通过程序运行我们可以发现,程序是这样运行的:
                 * 先执行try 如果try中有对变量的操作,并且试图将此变量返回,会将此变量的值暂存,等下面的catch(有可捕获异常的情况下)、finally块执行完,
                 * 将暂存的返回值返回,并不会再执行finally后面的代码
                 * tips:return语句后不能再跟程序代码
                 * */
        int i = 1;
        try{
            i++;
            System.out.println("try : "+i);
            return i;
        }
        catch (Exception e){
            i++;
            System.out.println("catch : "+i);
        }
        finally {
            i++;
            System.out.println("finally : "+i);
        }
        System.out.println("asdasda");
        return 56757;
    }


    //2、try中有return、catch中能捕获并且catch中有return
    static int testReturn2(){
        int i = 1;
        try{
            i++;
            System.out.println("try : "+i);
            int i1 = i/0;
            return i;
        }catch (Exception e){
            i++;
            System.out.println("catch : "+i);
            return i;
        }finally {
            i++;
            System.out.println("finally : "+i);
        }

        /**
         * 程序运行结果:
         * try : 2
         * catch : 3
         * finally : 4
         * i2_return : 3
         *
         * 如果方法中也有return语句的话,并且try块和catch块中都有return语句,编译的时候就会出错,反之try块和catch块单独有return语句的时候,方法中可以写return语句。
         * 或者如果finally块中有return语句的话,也会编译错误。
         * 我的理解是:finally块中有return语句的话肯定会执行,如果finally中没有,try、catch中有return语句的话,必定有一个会执行。
         *
         * 好了,接着讨论
         * 如果try块和catch块中都有return语句的话,肯定的,会返回catch块中的return语句。
         * 但是这里我要说明的是:
         * try块中的return语句也是执行了的,只不过执行到catch块中的时候被覆盖了而已。
         * 其实,这里最大的发现是,方法中的return语句在一定条件下不能出现的问题,有了解的朋友,可以在评论区发表自己的看法。
         * */
    }

    //finally块中有return语句
    static int testReturn3(){
        int i = 1;
        try{
            i++;
            System.out.println("try : "+i);
            int i1 = i/0;
            return i;
        }catch (Exception e){
            i++;
            System.out.println("catch : "+i);
            return i;
        }finally {
            i++;
            System.out.println("finally : "+i);
            return i;
        }
        // return i;(不能出现)

        /**
         * 运行结果:
         * try : 2
         * catch : 3
         * finally : 4
         * i3_return : 4
         *  与上面catch块中有return语句类似,try、catch块中的return语句执行了,只不过被finally块中的覆盖了。
         * */
    }

    static List testReturn4(){
        List<Integer> list = new ArrayList<Integer>();
        try {
            list.add(1);
            System.out.println("try : "+list);
            int i = 1/0;
            return list;
        }catch (Exception e){
            list.add(2);
            System.out.println("catch : "+list);
        }finally {
            list.add(3);
            System.out.println("finally : "+list);
        }
        return list;
    }

    /**
     * try : [1]
     * catch : [1, 2]
     * finally : [1, 2, 3]
     * list_return : [1, 2, 3]
     *
     * 集合类的情况与变量的情况不同,
     * 如果返回的类型是集合类型会将最后执行的return语句中的值返回。
     *
     * */

}