java文件读写异常必须显式处理,核心是区分检查型异常(如filenotfoundexception、ioexception)、用try-with-resources自动关闭资源、按 specificity 顺序捕获具体异常,避免空catch或笼统catch exception,并提前校验路径、权限与参数。

Java 文件读写异常必须显式处理,核心是区分检查型异常、确保资源自动释放、给出可定位的错误反馈。
捕获具体异常,不笼统 catch Exception
文件 I/O 抛出的主要是 检查型异常(编译器强制处理),常见有:
- FileNotFoundException:路径错误、文件不存在、目录当文件用
- IOException:读写中出错(磁盘满、断电、网络文件中断等)
- SecurityException:安全策略限制(如 Applet 环境或自定义 SecurityManager)
建议按 specificity 顺序捕获:先 catch (FileNotFoundException e),再 catch (IOException e)。避免只写 catch (Exception e) 或空 catch,否则会掩盖真实问题。
用 try-with-resources 自动关流,杜绝资源泄漏
手动 close 容易遗漏,尤其在异常中途跳出时。所有实现 AutoCloseable 的流(如 FileInputStream、BufferedReader、PrintWriter)都应放在 try 括号内:
try (BufferedReader reader = Files.newBufferedReader(Paths.get("data.txt"), StandardCharsets.UTF_8);
PrintWriter writer = new PrintWriter(new FileWriter("output.txt"))) {
String line;
while ((line = reader.readLine()) != null) {
writer.println(line.toUpperCase());
}
} catch (FileNotFoundException e) {
System.err.println("源文件未找到:" + e.getMessage());
} catch (IOException e) {
System.err.println("读写过程异常:" + e.getMessage());
// 推荐记录完整堆栈:logger.error("处理文件失败", e);
}
即使 readLine() 抛异常,reader 和 writer 仍会被 JVM 自动关闭。
提前校验路径与权限,减少运行时异常
很多“异常”其实源于前置疏忽:
- 用
Paths.get("xxx").toAbsolutePath()查清真实路径,别依赖相对路径直觉 - 读写前检查:
Files.exists(path)、Files.isReadable(path)、Files.isWritable(path) - Linux 下权限不足会抛
AccessDeniedException(IOException 子类),需提示用户执行chmod或联系运维
例如写入前加判断:
Path target = Paths.get("config.json");
if (!Files.isWritable(target.getParent())) {
throw new IllegalStateException("配置目录不可写,请检查权限:" + target.getParent());
}
对运行时异常做防御性检查
像 NullPointerException、IllegalArgumentException 虽不强制捕获,但极易由参数错误引发:
- 传入
null给new File(null)或Files.readAllLines(null)会直接崩溃 - 建议在方法入口用
Objects.requireNonNull(path, "path 不能为 null") - 路径字符串含非法字符(如 Windows 中的
:|?*)可能触发InvalidPathException,也属运行时异常,宜提前校验
不复杂但容易忽略。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











