Class.getResource() 返回 null。

14

我想在JPanel上显示图片,但是我一直收到以下错误信息:

java.lang.IllegalArgumentException: input == null!

我不理解发生了什么。

这是我正在使用的代码:

public void actionPerformed(ActionEvent e) {
    try {
        Image image=ImageIO.read(getClass().getResource("img/" +num.getText()+".jpg"));

        Image resized = image.getScaledInstance(200, 200, 100);
        pictureFrame.setIcon(new ImageIcon(resized));
    } catch (Exception ex){
        ex.printStackTrace();
    }
}

这只是导致我出现错误的原因!

堆栈跟踪产生以下结果:

Java.lang.IllegalArgumentException: input == null!
    at javax.imageio.ImageIO.read(ImageIO.java:1362)
    at work.Item.actionPerformed(Item.java:96)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
    at java.awt.Component.processMouseEvent(Component.java:6297)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3275)
    at java.awt.Component.processEvent(Component.java:6062)
    at java.awt.Container.processEvent(Container.java:2039)
    at java.awt.Component.dispatchEventImpl(Component.java:4660)
    at java.awt.Container.dispatchEventImpl(Container.java:2097)
    at java.awt.Component.dispatchEvent(Component.java:4488)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4575)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4236)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4166)
    at java.awt.Container.dispatchEventImpl(Container.java:2083)
    at java.awt.Window.dispatchEventImpl(Window.java:2489)
    at java.awt.Component.dispatchEvent(Component.java:4488)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:668)
    at java.awt.EventQueue.access$400(EventQueue.java:81)
    at java.awt.EventQueue$2.run(EventQueue.java:627)
    at java.awt.EventQueue$2.run(EventQueue.java:625)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98)
    at java.awt.EventQueue$3.run(EventQueue.java:641)
    at java.awt.EventQueue$3.run(EventQueue.java:639)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:638)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

我该怎么解决这个问题?我已经检查了图片的位置并尝试了不同的位置,但始终遇到相同的错误!

我正在使用Netbeans IDE。


2
getClass().getResource("img/" +num.getText()+".jpg")返回null返回值:如果没有找到此名称的资源,则为 URL 对象或 null - Esailija
根据您的帖子,使用调试模式应该很容易理解问题所在。 - Tako
你的当前工作目录是否不是你所期望的?另外,你是否已经打印出"img/"+num.getText()+".jpg"以确保它符合你的预期? - beatgammit
1
@tjameson,我把图像文件夹放在了所有.java文件的src中,但出现了错误。我把它放到src外面,还是出现了错误。问题出在哪里? - user2201158
1
@tjameson 我看了一下发布的线程,运行代码后输出如下: 使用 System 当前目录:C:\Documents and Settings\Administrator\My Documents\Work 没有提到 src/images,因为这是我想要的图像存储位置。 - user2201158
显示剩余11条评论
2个回答

29
假设getClass()返回com.foo.bar.MyActionListener,getClass().getResource("img/foo.jpg")会在包com.foo.bar.img中查找名为foo.jpg的文件。如果该图片不在此包中,或者它在此包中但其根目录不在类路径中,则该方法将返回null。
如果img文件夹位于类路径的根目录下,您应该使用getClass().getResource("/img/foo.jpg")(注意前导/),或者使用getClass().getClassLoader().getResource("img/foo.jpg")。

图片文件夹目前位于此路径下的src文件夹中: C:\Documents and Settings\Administrator\My Documents\Work - user2201158
因此,您应该在我的答案末尾使用我告诉您要使用的内容:getClass().getResource("/img/foo.jpg")getClass().getClassLoader().getResource("img/foo.jpg")。当然,您必须将 foo 替换为 num.getText() 返回的值:getClass().getResource("/img/" + num.getText() + ".jpg") - JB Nizet
System.out.println("::" + a + "::")正如预期地打印出a,但是前往build/img/a.jpg时没有找到文件。 - user2201158
那么你的IDE或构建过程没有将源目录中的非 .java 文件复制到构建目录中。据我所知,所有IDE都默认执行此操作。这是一个基本的NetBeans项目,还是Maven或Gradle项目?你确定它打印的是 ::a:: 而不是 :: a::::a ::(请注意空格)? - JB Nizet
1
有没有办法让它在不放入名为“classes”的目录中的情况下正常工作?我不能让它从src目录中的images文件夹加载吗?这是唯一的工作方式...我刚刚尝试了你说的清理和构建,是的,它被删除了,那我该怎么办才能避免这种情况呢...这个项目只是一个普通的Java应用程序。 - user2201158
显示剩余7条评论

0
你应该为源文件提供相对路径。例如,如果你有这个文件:
src
 --img
 --classes

如果您在 classes 文件夹中,应该编写如下内容:

getClass().getResource("../img/" +num.getText()+".jpg")

不要这样做。这种方法并非适用于所有情况。(例如,对于jar文件会失败。) - fabian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接