Java 9中加载资源文件时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

