← SEARCHABLE ARCHIVE
Java · 2026-08-06

从 Java 基础到掌握 — 第 7 集

处理异常和资源尝试失败

INTERACTIVE READING MODE →

该博客上撰写的文章是出于教学目的而创建的。 另外,文章中的信息可能不正确,请谨慎。

文件、网络和输入值随时都可能失败。 Java 的异常和资源管理语法用于传播故障并关闭任何路径上的资源。

传递异常

public Settings loadSettings(Path path) throws IOException {
    String json = Files.readString(path);
    return parser.parse(json);
}

如果调用者必须决定如何恢复,请勿强制在内部隐藏异常。 添加上下文时,必须保留原始异常作为原因。

try {
    settings = loadSettings(path);
} catch (IOException error) {
    logger.warn("settings load failed", error);
    settings = Settings.defaults();
}

只捕获可以处理的异常。 如果您捕获所有异常并且不采取任何措施,即使是实际的错误也可以正常进行。

try-with-resources

public List<String> readLines(Path path) throws IOException {
    try (BufferedReader reader = Files.newBufferedReader(path)) {
        return reader.lines().toList();
    }
}

如果您创建一个在括号内实现 AutoCloseable 的对象,则将在块末尾调用 close。 文件句柄在正常返回路径和异常路径上都会被清除。

检查异常和运行时异常

检查异常揭示了它们是通过方法声明还是通过 catch 处理。 运行时异常(例如 IllegalArgumentException)通常用于无效的调用约定或编程错误。

两者中的哪一个不一定更好,但标准是调用者是否可以恢复的失败。

完成后替换状态

Settings loaded = loadSettings(path);
currentSettings = loaded;

如果您完全创建一个新值并将其输入到字段中,即使加载失败,现有设置也将保留。 异常设计并不是要创建大量捕获,而是要确定在发生故障时如何保留资源和对象状态。