You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java 9中加载资源文件时InputStream遇NullPointerException求助

解决Java 9中InputStreamReader/InputStream的NullPointerException问题

我来帮你搞定这个资源路径导致的NPE问题~首先咱们梳理下核心矛盾:Java 9对类加载机制做了针对性调整,尤其是系统类加载器和应用类加载器的隔离性更强了,这直接影响了资源文件的查找逻辑。

问题根源

你在Java 8里用ClassLoader.class.getResourceAsStream("/resources/villes.csv")能正常运行,是因为当时系统类加载器还能访问到应用类路径下的资源;但Java 9之后,负责加载JDK核心类的系统类加载器,和负责加载你的项目代码/资源的应用类加载器做了更严格的隔离,用ClassLoader.class的类加载器去查找你项目里的资源,自然就找不到了,返回null后后续操作就触发了NullPointerException。

解决方案

结合你的目录结构(src下包含default package和resources子文件夹),给你两个靠谱的修改方案:

方案1:使用当前类的类加载器获取资源

假设你的调用代码在Main类里(位于default package),把原来的代码改成:

InputStream is = Main.class.getClassLoader().getResourceAsStream("resources/villes.csv");

这里要注意不要加开头的斜杠,因为ClassLoader的getResourceAsStream方法是从类路径的根目录开始查找的,resources/villes.csv对应类路径根下的resources文件夹里的villes.csv。

方案2:使用当前类的getResourceAsStream方法

同样以Main类为例,也可以这么写:

InputStream is = Main.class.getResourceAsStream("/resources/villes.csv");

这里需要加开头的斜杠,因为类的getResourceAsStream方法,带斜杠是从类路径根开始查找,不带斜杠则是从当前类所在的包路径开始查找(你的类在default package,其实和根路径一致,但加斜杠更明确)。

额外注意事项

  • 一定要确认你的resources文件夹被IDE标记为资源源目录:比如在Eclipse里右键resources文件夹 → Build Path → Use as Source Folder;这样编译时,resources里的文件会被自动复制到类路径对应的位置,确保程序能找到。
  • 可以先检查编译输出目录(比如bin或target文件夹),看看villes.csv是不是在resources子文件夹下,确认资源路径的正确性。

内容的提问来源于stack exchange,提问作者bb84000

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:29:06