Java中getResource()抛空指针异常及File类资源访问差异咨询
嘿,这俩问题其实是Java资源访问里的经典坑,我帮你拆解明白:
一、File类访问资源输出差异的原因
File类是基于操作系统的文件系统路径来定位资源的,它认的是你运行Java程序时的「当前工作目录」(比如在IDE里运行时,当前目录一般是你的项目根目录;如果在命令行运行,就是你执行java命令时所在的目录),不同的路径写法对应完全不同的位置:
- 当你写
new File("test.txt")时,它会在当前工作目录下找这个文件,比如你项目根目录下的test.txt就能被找到; - 当你写
new File("/test.txt")时,它会直接找操作系统的根目录(Windows下是C:/test.txt,Linux下是/test.txt),如果根目录没有这个文件,自然就找不到; - 如果你写的是相对路径比如
new File("src/test.txt"),那它会在当前工作目录的src子目录下找,这在IDE开发时可能有效,但一旦把程序打包成JAR,这种写法就彻底失效——因为JAR里的资源不是文件系统里的独立文件,而是JAR包内的条目。
所以你看到的输出差异,本质就是不同路径指向了文件系统里的不同位置,有些位置有文件,有些没有,结果自然不一样。
二、类的getResource()抛出NullPointerException的原因
Class.getResource()是**基于类加载路径(classpath)**来查找资源的,和File类的逻辑完全不同!它的规则是:
- 路径开头不带斜杠(比如
getResource("test.txt")):会在当前类所在的包路径下找资源,比如你的类在com.example包下,那它会找classpath里com/example/test.txt这个位置; - 路径开头带斜杠(比如
getResource("/test.txt")):会直接在classpath根目录下找资源,也就是你项目里src/main/resources(Maven/Gradle)或者src目录下的文件;
如果getResource()找不到对应的资源,它会直接返回null,这时候如果你直接调用比如getResource(...).openStream()这种方法,就会抛出NullPointerException。你最后三条语句出问题,大概率是这几个原因:
- 资源放错位置了:比如你要找
/test.txt,但test.txt没放在classpath根目录(比如IDE里没放到resources文件夹,或者打包时没把资源打进JAR); - 路径拼写错误:classpath路径是大小写敏感的!哪怕Windows文件系统不区分大小写,类加载器认的是严格的大小写,比如你写了
Test.txt但实际文件是test.txt,就会找不到; - 相对路径对应错了包:比如你的类在
com.example包下,你写getResource("test.txt"),但test.txt放在了classpath根而不是com/example目录下,自然返回null。
建议你先打印一下getResource()的返回值,看看是不是null,再检查资源的实际位置和路径写法是否匹配。
内容的提问来源于stack exchange,提问作者Asif Mushtaq
相关产品推荐
相关产品推荐

