使用ImageIO.read(getResource())加载图片报input==null错误求助
问题排查:ImageIO.read抛出IllegalArgumentException: input == null!
问题描述
执行以下代码时出现报错:
Image img = ImageIO.read(this.getClass().getResource("/2.png"));
报错信息:
Exception in thread "main" java.lang.IllegalArgumentException: input == null! at java.desktop/javax.imageio.ImageIO.read(ImageIO.java:1400) at studentsystem.frame.StudentSystemLoginFrame.<init>(StudentSystemLoginFrame.java:121) at studentsystem.run.TestLogin.main(TestLogin.java:7)
项目目录结构(根据截图整理):
- 项目根目录
- studentsystem(主包)
- frame(子包,包含
StudentSystemLoginFrame类) - run(子包,包含
TestLogin类)
- frame(子包,包含
- 2.png(与
studentsystem包同级)
- studentsystem(主包)
错误原因
this.getClass().getResource("/2.png")是从类路径根目录查找资源,但当前存在两个核心问题:
2.png放在项目根目录,而非类路径根目录(默认类路径根是编译后的target/classes或bin目录),IDE默认不会自动将项目根目录的非源码文件复制到类路径中。- 当
getResource找不到指定路径的资源时会返回null,传递给ImageIO.read()就会触发input == null!异常。
解决方法
方法1:调整图片位置到类路径资源目录
- 若为Maven/Gradle项目,将
2.png移动到src/main/resources目录;若为普通Java项目,移动到src目录下。 - 保持原有代码不变,编译后图片会被自动复制到类路径根目录,
getResource("/2.png")即可找到资源。
方法2:修改资源查找路径
- 使用相对路径查找(基于当前类的包路径):
当前类在studentsystem.frame包下,需要向上跳出两级包目录才能找到同级的2.png,代码修改为:Image img = ImageIO.read(this.getClass().getResource("../../2.png")); - 或者使用系统类加载器从类路径根查找(需确保图片已被复制到类路径):
Image img = ImageIO.read(ClassLoader.getSystemResource("2.png"));
方法3:配置IDE自动复制资源文件
- 在IntelliJ IDEA中:右键项目根目录的
2.png→Mark Directory as→Resources Root(若图片放在单独目录,标记该目录为资源根);或进入File → Project Structure → Modules,在Resources标签页添加包含图片的目录。 - 在Eclipse中:右键图片文件→
Build Path→Add to Build Path,确保编译时文件会被复制到输出目录。
内容的提问来源于stack exchange,提问作者papi
相关产品推荐
相关产品推荐

