try、catch、finally执行顺序

191 阅读2分钟

try、catch、finally执行顺序

原文链接:try、catch、finally执行顺序 | 柳门竹巷 (zhbblog.top)

try中有return

public class Test {
    public static void main(String[] args) throws IOException {
        System.out.println("返回结果:"+test());
    }
    public static int test(){
        int num = 0;
        try {
            System.out.println("进入--> try ");
            num = 1;
            System.out.println("try方法--> num=" + num);
            return num;
        } catch (Exception e) {
            System.out.println("进入--> catch ");
            num = 2;
            System.out.println("catch方法--> num=" + num);
        } finally {
            System.out.println("进入--> finally ");
            num = 3;
            System.out.println("finally方法--> num=" + num);
        }
        return num;
    }
}
// 输出结果:
// 进入--> try 
// try方法--> num=1
// 进入--> finally 
// finally方法--> num=3
// 返回结果:1

catch中有return

public class Test {
    public static void main(String[] args) throws IOException {
        System.out.println("返回结果:"+test());
    }
    public static int test(){
        int num = 0;
        try {
            System.out.println("进入--> try ");
            // 产生异常
            int i = 1/0;
            num = 1;
            System.out.println("try方法--> num=" + num);
            return num;
        } catch (Exception e) {
            System.out.println("进入--> catch ");
            num = 2;
            System.out.println("catch方法--> num=" + num);
            return num;
        } finally {
            System.out.println("进入--> finally ");
            num = 3;
            System.out.println("finally方法--> num=" + num);
        }
    }
}
// 输出结果:
// 进入--> try 
// 进入--> catch 
// catch方法--> num=2
// 进入--> finally 
// finally方法--> num=3
// 返回结果:2

finally中有return

public class Test {
    public static void main(String[] args) throws IOException {
        System.out.println("返回结果:"+test());
    }
    public static int test(){
        int num = 0;
        try {
            System.out.println("进入--> try ");
            num = 1;
            System.out.println("try方法--> num=" + num);
            // 产生异常
            int i = 1/0;
            return num;
        } catch (Exception e) {
            System.out.println("进入--> catch ");
            num = 2;
            System.out.println("catch方法--> num=" + num);
            return num;
        } finally {
            System.out.println("进入--> finally ");
            num = 3;
            System.out.println("finally方法--> num=" + num);
            return num;
        }
    }
}
// 输出结果:
// 进入--> try 
// try方法--> num=1
// 进入--> catch 
// catch方法--> num=2
// 进入--> finally 
// finally方法--> num=3
// 返回结果:3

return的值为对象

public class Test {
    public static void main(String[] args) throws IOException {
        System.out.println("返回结果:"+ArrayUtil.toString(test()));
    }
    public static List<String> test(){
        List<String> list = new ArrayList<>();
        try {
            System.out.println("进入--> try ");
            list.add("try");
            System.out.println("try方法--> list=" + ArrayUtil.toString(list));
            // 产生异常
            int i = 1/0;
            return list;
        } catch (Exception e) {
            System.out.println("进入--> catch ");
            list.add("catch");
            System.out.println("catch方法--> list=" + ArrayUtil.toString(list));
        } finally {
            System.out.println("进入--> finally ");
            list.add("finally");
            System.out.println("finally方法--> list=" + ArrayUtil.toString(list));
        }
        return list;
    }
}
// 输出结果:
// 进入--> try 
// try方法--> list=[try]
// 进入--> catch 
// catch方法--> list=[try, catch]
// 进入--> finally 
// finally方法--> list=[try, catch, finally]
// 返回结果:[try, catch, finally]

程序退出或其他导致程序中断

public class Test {
    public static void main(String[] args) throws IOException {
        System.out.println("返回结果:"+test());
    }
    public static int test(){
        int num = 0;
        try {
            System.out.println("进入--> try ");
            // 退出程序
            System.exit(0);
            num = 1;
            System.out.println("try方法--> num=" + num);
            return num;
        } catch (Exception e) {
            System.out.println("进入--> catch ");
            num = 2;
            System.out.println("catch方法--> num=" + num);
            return num;
        } finally {
            System.out.println("进入--> finally ");
            num = 3;
            System.out.println("finally方法--> num=" + num);
            return num;
        }
    }
}
// 输出结果:
// 进入--> try 

总结:

  1. 执行顺序:try --> catch(如果有异常)--> finally --> finally中的return --> try/catch中的return
  2. finally中有return时,会直接在finally中退出,导致try、catch中的return失效
  3. finally不一定会被执行,比如手动调用System.exit(0)或栈溢出、内存溢出等其他导致程序中断的情况
  4. 需要注意return返回值的类型,是否会受到finally中代码的影响
    1. 如果是基本数据类型:当try中带有return时,会先执行return前的代码,然后暂时保存需要return的信息,再执行finally中的代码,最后再通过return返回之前保存的信息
    2. 如果是对象:return中保存的是对象的引用地址,当在finally中改变对象的属性时,return返回的对象也会跟着改变