Java项目getResourceAsStream()获取资源报NullPointerException求助
解决getResourceAsStream()抛出NullPointerException的问题
首先得明确:你遇到的核心问题确实和resource文件夹不在类路径有关——getResourceAsStream()是从JVM的类路径(classpath)中加载资源的,不管路径写法对不对,资源不在类路径里就肯定找不到,自然会返回null,调用时就触发NPE了。
下面给你两种可行的解决方案,按需选择:
方案1:调整项目结构为标准资源目录(推荐)
Java项目的标准结构(比如Maven/Gradle默认遵循的)会把资源目录放在src/main/resources下,构建工具或IDE会自动把这个目录加入类路径。你可以把现有resource文件夹调整到src下,改名成resources更规范,调整后的结构如下:
项目文件夹 ├── src │ ├── PackageA │ │ └── MainClass(含main方法) │ ├── PackageB │ │ └── SecondClass │ └── resources │ └── image.jpg
之后在SecondClass里调用资源的写法:
// 方式1:用当前类的getResourceAsStream,路径以/开头表示类路径根 InputStream is = getClass().getResourceAsStream("/image.jpg"); // 方式2:用ClassLoader的getResourceAsStream,路径直接从类路径根开始,不需要/ InputStream is = getClass().getClassLoader().getResourceAsStream("image.jpg");
方案2:手动将resource文件夹标记为资源根(不调整结构)
如果不想改动现有项目结构,你可以在IDE里把resource文件夹标记为「资源根目录」,让IDE自动把它加入类路径:
- 以IntelliJ IDEA为例:
- 打开
File -> Project Structure -> Modules - 选中你的项目模块,切换到
Sources标签页 - 找到左侧的resource文件夹,右键点击选择
Mark Directory as -> Resources Root
- 打开
- Eclipse的话:
- 右键项目 ->
Build Path -> Configure Build Path - 在
Source标签页,点击Add Folder,选中resource文件夹并添加
- 右键项目 ->
标记完成后,你只需要把调用路径改成/image.jpg(因为resource现在是类路径根,里面的image.jpg直接处于根路径下):
InputStream is = getClass().getResourceAsStream("/image.jpg");
额外注意点
- 避免使用
/resource/image.jpg这种路径:之前你尝试的这个路径,是在类路径下找名为resource的子文件夹里的image,但你的resource本身不在类路径,所以完全找不到。 - 清理IDE缓存:如果调整后还是找不到,试试清理IDE的缓存(比如IntelliJ的
File -> Invalidate Caches...),有时候缓存会导致资源加载不及时。 - 区分Class和ClassLoader的getResourceAsStream:Class的方法如果路径不带/,会从当前类所在的包路径下找资源;ClassLoader的方法则始终从类路径根开始,不需要加/。
内容的提问来源于stack exchange,提问作者Adi Pascu
相关产品推荐
相关产品推荐

