Java的异常处理机制主要通过try、catch、finally三个关键字配合实现,不同的代码执行场景下,三者的执行顺序存在明确规则,理解这些规则是写出正确异常处理逻辑的基础。

无异常发生时的执行顺序
当try块中的代码全部正常执行,没有抛出任何异常时,执行流程为:先执行try块内的所有代码,然后跳过所有catch块,最后执行finally块中的代码。
public class ExceptionOrderDemo {
public static void main(String[] args) {
try {
System.out.println("执行try块代码");
} catch (Exception e) {
System.out.println("执行catch块代码");
} finally {
System.out.println("执行finally块代码");
}
System.out.println("执行后续代码");
}
}
上述代码运行后输出结果为:
执行try块代码 执行finally块代码 执行后续代码
发生异常且被catch捕获时的执行顺序
如果try块中某行代码抛出了异常,且该异常类型匹配某个catch块的捕获类型,执行流程为:try块中异常发生位置之后的代码不再执行,跳转到对应的catch块执行异常处理逻辑,catch块执行完成后,再执行finally块中的代码。
public class ExceptionOrderDemo2 {
public static void main(String[] args) {
try {
System.out.println("执行try块前半部分代码");
int a = 1 / 0; // 抛出算术异常
System.out.println("执行try块后半部分代码"); // 不会执行
} catch (ArithmeticException e) {
System.out.println("捕获到算术异常,执行catch块代码");
} finally {
System.out.println("执行finally块代码");
}
System.out.println("执行后续代码");
}
}
上述代码运行后输出结果为:
执行try块前半部分代码 捕获到算术异常,执行catch块代码 执行finally块代码 执行后续代码
发生异常未被catch捕获时的执行顺序
如果try块抛出的异常没有匹配的catch块捕获,执行流程为:异常发生位置之后的try代码不再执行,跳过所有catch块,直接执行finally块代码,finally执行完成后,异常会向上抛给方法的调用者。
public class ExceptionOrderDemo3 {
public static void main(String[] args) {
try {
System.out.println("执行try块代码");
int a = 1 / 0;
System.out.println("try块后续代码"); // 不会执行
} catch (NullPointerException e) {
System.out.println("捕获空指针异常"); // 不会执行
} finally {
System.out.println("执行finally块代码");
}
System.out.println("执行后续代码"); // 不会执行,异常抛出后程序终止
}
}
上述代码运行后输出结果为:
执行try块代码 执行finally块代码 Exception in thread "main" java.lang.ArithmeticException: / by zero
包含return语句时的执行顺序
try块中有return的情况
如果try块中执行到return语句,会先执行return后面的表达式计算,将返回值暂存,然后执行finally块代码,finally块执行完成后,再将之前暂存的返回值返回。如果finally块中也有return语句,会覆盖try块的返回值。
public class ReturnOrderDemo1 {
public static int test() {
try {
System.out.println("执行try块代码");
return 1;
} catch (Exception e) {
System.out.println("执行catch块代码");
return 2;
} finally {
System.out.println("执行finally块代码");
}
}
public static void main(String[] args) {
int result = test();
System.out.println("方法返回值:" + result);
}
}
上述代码运行后输出结果为:
执行try块代码 执行finally块代码 方法返回值:1
finally块中有return的情况
如果finally块中存在return语句,那么方法的返回值会是finally块中return的结果,try块中的return会被忽略。
public class ReturnOrderDemo2 {
public static int test() {
try {
System.out.println("执行try块代码");
return 1;
} catch (Exception e) {
System.out.println("执行catch块代码");
return 2;
} finally {
System.out.println("执行finally块代码");
return 3;
}
}
public static void main(String[] args) {
int result = test();
System.out.println("方法返回值:" + result);
}
}
上述代码运行后输出结果为:
执行try块代码 执行finally块代码 方法返回值:3
核心规则总结
- finally块中的代码无论是否发生异常,也无论是否有return语句,都会被执行,除非程序在try或catch块中调用了
System.exit()方法终止JVM。 - try块中发生异常后,异常位置之后的代码不会再执行。
- catch块只有当捕获到对应类型的异常时才会执行。
- 如果finally块中有return语句,会覆盖之前try或catch块中的return结果。
掌握这些执行顺序规则,就能准确预判异常处理代码的运行结果,避免因为逻辑混乱导致的程序bug。
Java异常处理try_catch_finally异常执行顺序异常流程修改时间:2026-06-13 16:00:28