Java 异常抛出后代码是否继续执行:编译期与运行期分析

季宁
季宁
发布时间:2026-10-16| 5人浏览过
原创

本文详细解析 Java 中异常抛出后后续代码的执行规则。重点区分了编译期错误(无法访问的语句)与运行期逻辑(try-catch 捕获、条件分支中断)。同时归纳了受检异常与非受检异常的区别及常见类型,帮助开发者正确处理 Java 异常流程。

异常抛出后,代码是否还能执行?

在 Java 开发中,当 throw 关键字抛出异常时,其后的代码是否能被执行,取决于该异常是在编译期被判定为不可达,还是在运行期被实际触发。以下通过具体场景进行分析:

情况一:编译期报错“无法访问的语句”

如果一段代码前直接存在一个声明抛出的 checked exception(非运行时异常),且没有被 try...catch 包裹,编译器会认为后续的代码永远不会被执行,从而在编译阶段直接报错。

// 示例 1
public static void test() throws Exception {
    throw new Exception("参数越界"); 
    System.out.println("异常后"); // 编译错误:Unreachable statement (无法访问的语句)
}

结论:若一段代码前有未捕获的受检异常抛出,这段代码将产生编译时错误。

情况二:被 try-catch 捕获后,代码可以执行

如果异常抛出在一个 try 块中,并且随后的 catch 块成功捕获并处理了该异常(且在 catch 中没有再次抛出新的受检异常),那么 try...catch 结构之后的代码是可以正常执行的。

// 示例 2
try {
    throw new Exception("参数越界"); 
} catch (Exception e) {
    e.printStackTrace();
}
System.out.println("异常后"); // 可以正常执行

结论:若一段代码前有异常抛出并被成功捕获(且 catch 内部无新异常抛出),后续代码能够被执行。

情况三:条件语句中的异常,导致逻辑分支中断

如果在控制流语句(如 if)中抛出异常,程序能够顺利通过编译。但当满足条件触发异常时,当前方法栈帧通常会被销毁或跳过,导致该方法中剩余的顺序代码无法执行。主调方法必须处理该异常,否则程序将终止。

// 示例 3
public static void main(String[] args) {
    try {
        test();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public static void test() throws Exception {
    if (true) {
        throw new Exception("参数越界");
    }
    System.out.println("异常后"); // 不会执行,因为异常已抛出并脱离当前方法
}

结论:若在条件语句中抛出异常,程序能被编译,但抛出点之后的同层级代码不会被执行。

情况四:Catch 块内重新抛出异常

在 try...catch 结构中,如果 catch 块在处理完错误日志后,使用 throw 重新抛出了一个新的受检异常,那么该 try-catch 结构之后的代码同样会被编译器标记为不可达。

// 示例 4
public static void test() throws Exception {
    try {
        int i = 1 / 0; // 触发 ArithmeticException
    } catch (Exception e) {
        e.printStackTrace();
        // 在 catch 中再次抛出受检异常
        throw new Exception("代码执行异常后打印并抛出异常提示");
    }
    System.out.println("异常后"); // 不会执行
}

// 控制台输出日志示例:
// java.lang.ArithmeticException: / by zero
// ... (堆栈跟踪) ...
// java.lang.Exception: 代码执行异常后打印并抛出异常提示

运行时异常与非运行时异常的核心区别

理解 Java 异常体系,关键在于区分 受检异常(Checked Exception) 和 非受检异常(Unchecked Exception/Runtime Exception)。

1. 运行时异常(Runtime Exception)

  • 定义:继承自 RuntimeException 及其子类的异常,如 NullPointerException(空指针)、IndexOutOfBoundsException(数组越界)、ArithmeticException(算术异常)等。
  • 特性:属于非受检异常(Non-Checked Exception)。这类异常通常由程序逻辑错误或系统底层问题引起。
  • 处理方式:JVM 默认会自动捕获这些异常并停止线程,打印异常堆栈。编译器不强制要求对这些异常进行 try-catch 捕获或向上抛出(throws),当然开发者也可以主动捕获以提供友好的用户提示。

2. 非运行时异常(Checked Exception)

  • 定义:除了 RuntimeException 以外的所有其他异常,均属于此类,它们都是 Exception 的直接子类。
  • 特性:属于受检异常。通常涉及外部资源交互失败(如文件不存在、网络超时、SQL 语法错误等)。
  • 处理方式:编译器强制检查。如果方法可能抛出此类异常,则必须:
    • 要么在方法签名中使用 throws 声明向上抛出;
    • 要么在当前方法中使用 try...catch 进行捕获处理。
  • 判断技巧:通常查看 API 文档,写了 throws 关键字且不属于 RuntimeException 体系的,基本都是受检异常。

常见运行时异常对照表

了解常见的运行时异常有助于快速定位 Bug:

  • NullPointerException:试图访问 null 对象的属性或方法。
  • ClassCastException:对象强制类型转换出错。
  • IllegalArgumentException:方法接收到不合法或不恰当的参数。
  • NoSuchMethodException:访问的方法不存在。
  • ArrayIndexOutOfBoundsException:数组索引越界。
  • ArithmeticException:算术运算错误(如除以零)。
  • OutOfMemoryError:内存溢出。
  • StackOverflowError:栈溢出。
  • IllegalStateException:环境或应用状态不适用于请求操作。
  • NumberFormatException:数字格式转换错误。
  • UnsupportedOperationException:不支持的操作或方法。
  • AvgZeroDivisionException:自定义/特定库中的除零异常。

常见非运行时异常对照表

  • ClassNotFoundException:类加载器找不到指定类。
  • SQLException:数据库访问错误。
  • FileNotFoundException:文件未找到。
  • IOException:输入输出流传输错误。
  • InterruptedException:线程被中断。
  • ParseException:解析日期或字符串格式错误。
  • NoSuchAlgorithmException:请求的安全算法不可用。
  • ReflectiveOperationException:反射操作相关的异常。
  • CloneNotSupportedException:clone 操作不被支持。
  • IllegalAccessException:无法访问受限成员。
  • InstantiationException:试图实例化抽象类或接口。
  • NoSuchFieldException:访问的字段不存在。
  • TimeoutException:操作超时。
相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。