try、catch、finally的执行顺序

本文详细探讨了Java中异常处理时try、catch、finally块的执行顺序,以及在不同场景下带有return语句的情况。在异常发生时,finally块总是会执行。对于基本类型和引用类型的返回值,finally块中的代码会影响到返回结果。如果finally中有return,会覆盖之前的return,导致try和catch中的return失效。
摘要由CSDN通过智能技术生成

1. 不带 return 的执行顺序

异常处理中,try、catch 、finally 的执行顺序:

  • 如果 try 中没有异常,执行顺序为:try —> finally
  • 如果 try 中有异常,执行顺序为:try —> catch —> finally
public class Test {

  public static int rank;

  public static void main(String[] args) {
    rank = 1;
    solve2();
    System.out.println("over");
  }

  public static void solve1() throws Exception {
    try {
      System.out.println("solve 1 try, rank: " + rank++);
      throw new Exception("throw by solve 1");
    } finally {
      System.out.println("solve 1 finally, rank: " + rank++);
    }
  }

  public static void solve2() {
    try {
      System.out.println("solve 2 try, rank: " + rank++);
      solve1();
    } catch (Exception e) {
      System.out.println("catch exception: " + e.getMessage() + ", rank: " + rank++);
    } finally {
      System.out.println("solve 2 finally, rank: " + rank++);
    }
  }

}

// solve 2 try, rank: 1
// solve 1 try, rank: 2
// solve 1 finally, rank: 3
// catch exception: throw by solve 1, rank: 4
// solve 2 finally, rank: 5
// over

首先是 try 执行,如果发生异常,那就直接捕获异常,最后执行 finally。但是,如果抛出异常,例如在 solve1 方法中,throw 了一个异常,那么不会立刻回溯到上一方法,而是仍然执行 finally。

2. 带 return 的执行顺序

2.1 try 中带 return 的

基本类型:

public class Test {
    
    public static void main(String[] args) {
      System.out.println(testReturn());
    }

    public static int testReturn() {
        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);
        }
        return i;
    }
}

// try: 2
// finally: 3
// 2

引用类型:

public static void main(String[] args) {
  System.out.println(testReturn2());
}

public static List<Integer> testReturn2() {
  List<Integer> list = new ArrayList<>();
  try {
    list.add(1);
    System.out.println("try: " + list);
    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]
// finally: [1, 3]
// [1, 3]
2.2 catch 中带 return 的
public static void main(String[] args) {
  System.out.println(testReturn3());
}

public static int testReturn3() {
  int i = 1;
  try {
    i++;
    System.out.println("try: " + i);
    int x = i / 0;
  } catch (Exception e) {
    i++;
    System.out.println("catch: " + i);
    return i;
  } finally {
    i++;
    System.out.println("finally: " + i);
  }
  return i;
}

// try: 2
// catch: 3
// finally: 4
// 3
2.3 finally 中带 return 的
public static void main(String[] args) {
  System.out.println(testReturn4());
}

public static int testReturn4() {
  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);
    return i;
  }
}
    
//try: 2
//finally: 3
//3
  • finally 中的代码总会执行
  • 当 try、catch 中有 return 时,也会执行 finally。return 的时候,要注意返回值的类型,是否收到 finally 中代码的影响
  • finally 中有 return 时,会直接在 finally 中退出,导致 try、catch 中的 return 失效

参考

https://www.cnblogs.com/pcheng/p/10968841.html
https://blog.csdn.net/iwts_24/article/details/88849690
https://blog.csdn.net/cockroach02/article/details/80186723

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值