讲师中心 微信公众号
AI工具推荐 视频效率加速

什么是IOException与FileNotFoundException_处理文件流时的异常预防

落伟同学_4881

落伟同学_4881

发布时间:2026-02-14 02:11:28

|

122人浏览过

|

来源于php中文网

原创

FileNotFoundException总被IOException“吃掉”是因为它是IOException的子类,catch顺序必须由具体到宽泛,否则编译报错;需用try-with-resources防资源泄漏;路径不存在常因父目录未创建,应主动mkdirs();exists()有竞态风险,优先try-catch。

什么是ioexception与filenotfoundexception_处理文件流时的异常预防

FileNotFoundException 为什么总被 IOException “吃掉”?

因为 FileNotFoundException 是 IOException 的子类,Java 的 catch 块按顺序匹配——如果先写 catch (IOException e),后面的 catch (FileNotFoundException e) 就永远进不去,编译器甚至会报错“已捕获的异常”。这不是 bug,是继承关系决定的语义逻辑。

  • 必须把更具体的异常放在前面:FileNotFoundException → IOException(其他 IO 错误)→ 可选的 SecurityException 等
  • 如果只 catch IOException,你无法区分“文件不存在”和“磁盘满”“权限不足”等不同场景,后续重试、提示或日志都失去针对性
  • IDE(如 IntelliJ)通常会自动警告并帮你调整 catch 顺序,别点“忽略”

用 try-with-resources 不只是省代码,更是防泄漏

手动调用 fis.close() 或 fos.close() 很容易漏写、写在错误位置,或者在异常发生后跳过关闭逻辑,导致句柄堆积、文件被锁死。而 try-with-resources 在 Java 7+ 中强制要求资源实现 AutoCloseable,无论是否抛异常,都会在块结束时自动调用 close()。

  • 资源声明必须在 try (…) 括号内,且只能是支持自动关闭的类型(FileInputStream、BufferedReader、FileOutputStream 等都符合)
  • 多个资源用分号隔开:try (FileInputStream fis = new FileInputStream("a.txt"); FileOutputStream fos = new FileOutputStream("b.txt")) { … }
  • 不要在 try 块里再手动 close(),否则可能触发 IOException(流已关闭),反而干扰主逻辑

“文件不存在”不等于路径写错了——常见误判点

看到 java.io.FileNotFoundException: d:studyioinfo.txt (系统找不到指定的路径。),很多人第一反应是“文件名拼错了”,但更常踩的坑其实是:父目录压根就不存在。

  • FileOutputStream 能自动创建**文件**,但不会创建**中间目录**。路径 d:/study/io/info.txt 中若 d:/study/io 不存在,就会直接抛 FileNotFoundException
  • 用 new File(path).getParentFile().mkdirs() 主动创建目录树,再执行 IO 操作
  • 相对路径易受 user.dir 影响,运行前加一句 System.out.println(System.getProperty("user.dir")) 确认当前工作目录
  • Windows 下路径分隔符用 / 或 \ 都行,但硬写 会触发转义(如 "d:studyio" 报错),务必写成 "d:\study\io" 或 "d:/study/io"

什么时候该检查 exists(),什么时候该直接 try-catch?

提前用 file.exists() 判断看似稳妥,实则引入竞态条件(TOCTOU):判断时存在,真正 open 时已被删除或权限变更。除非业务强依赖“存在即可用”的原子性(如配置文件预检),否则应优先信任 try-catch。

  • 读操作:直接 try-catch FileNotFoundException 更可靠;exists() 只适合做调试输出或用户友好提示(如“配置文件未找到,请检查 config.json 是否存在”)
  • 写操作:若需确保目录可写,可用 file.getParentFile().canWrite() 辅助判断,但最终仍要靠 catch 处理实际失败
  • 注意:exists() 对符号链接、NFS 挂载点等特殊文件系统可能返回不准,而异常机制始终真实反映 OS 层面的打开结果

最麻烦的不是异常本身,而是把 FileNotFoundException 当作普通错误处理,却忽略了它背后暴露的路径构造逻辑、目录初始化缺失或部署环境差异——这些往往藏在构建脚本、Dockerfile 或 CI 配置里,不在 Java 代码中。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2175

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

3402

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

1136

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

3919

2025.09.10

json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2175

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

3402

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

1136

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

3919

2025.09.10

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

60

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn