ZetCode

Java RuntimeException

最后修改于 2025 年 4 月 2 日

RuntimeException 是 Java 中一种特殊的异常类别,它代表程序正常执行期间可能发生的问题。与检查型异常不同,RuntimeException 在编译时不会进行验证。

RuntimeException 的关键特性是它是非检查型的 - 方法不需要声明它们可能抛出它,并且调用者不必强制处理它。这使得 RuntimeException 适合于指示编程错误而不是可恢复的状况。

理解 RuntimeException

RuntimeException 位于非检查型异常层次结构的顶部。它扩展了 Exception,但在 Java 的异常处理机制中被特别标记为绕过编译时检查。

Java 语言规范指出,RuntimeException “免于编译时检查,因为它们可能出现在程序的许多位置,并且必须声明它们会使程序变得混乱。”

RuntimeException 层次结构
Throwable
    ├── Exception
    │     ├── RuntimeException
    │     │     ├── NullPointerException
    │     │     ├── IllegalArgumentException
    │     │     └── ...others...
    │     └── ...checked exceptions...
    └── Error

何时使用 RuntimeException

RuntimeException 应该用于以下情况:

RuntimeException 的良好候选者包括参数验证失败、非法状态条件以及错误是由不正确的程序逻辑而不是环境因素导致的其他情况。

抛出 RuntimeException

您可以直接抛出 RuntimeException 或创建自定义子类。基本模式与其他异常类似

ThrowingRuntimeException.java
void processInput(String input) {
    if (input == null) {
        throw new RuntimeException("Input cannot be null");
    }
    // Process the input
}

此示例显示了用于参数验证的基本 RuntimeException 用法。该异常将沿着调用堆栈向上传播,直到被捕获或直到它终止线程。

创建自定义 RuntimeException

对于更具体的错误处理,您可以创建自定义 RuntimeException 子类。这遵循与其他自定义异常相同的模式

CustomRuntimeException.java
class ConfigurationException extends RuntimeException {
    public ConfigurationException(String message) {
        super(message);
    }
    
    public ConfigurationException(String message, Throwable cause) {
        super(message, cause);
    }
}

void loadConfig(String path) {
    if (!isValidConfig(path)) {
        throw new ConfigurationException("Invalid configuration: " + path);
    }
    // Load configuration
}

此自定义 RuntimeException 提供更具体的错误信息,同时保持 RuntimeException 的非检查性质。

处理 RuntimeException

虽然不是必需的,但您可以像处理任何其他异常一样捕获 RuntimeException。这通常在应用程序中的战略边界处完成

HandlingRuntimeException.java
void processRequest(Request request) {
    try {
        validateRequest(request);
        executeRequest(request);
    } catch (RuntimeException e) {
        log.error("Request processing failed", e);
        throw new ServiceException("Request failed", e);
    }
}

此示例显示了在服务边界处捕获 RuntimeException,记录它,并可能将其转换为另一种异常类型以供调用者使用。

最佳实践

使用 RuntimeException 时

何时不使用 RuntimeException

避免将 RuntimeException 用于

来源

Oracle RuntimeException 文档

作者

我叫 Jan Bodnar,是一位充满热情的程序员,拥有丰富的编程经验。 自 2007 年以来,我一直在撰写编程文章。 迄今为止,我撰写了超过 1,400 篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有 Java教程。