从 Java 基础到掌握 — 第 7 集
处理异常和资源尝试失败
该博客上撰写的文章是出于教学目的而创建的。 另外,文章中的信息可能不正确,请谨慎。
文件、网络和输入值随时都可能失败。 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;
如果您完全创建一个新值并将其输入到字段中,即使加载失败,现有设置也将保留。 异常设计并不是要创建大量捕获,而是要确定在发生故障时如何保留资源和对象状态。