【问题标题】:getClassLoader().getResource() returns nullgetClassLoader().getResource() 返回 null
【发布时间】:2010-10-12 03:50:12
【问题描述】:

我有这个测试应用:

import java.applet.*;
import java.awt.*;
import java.net.URL;
public class Test extends Applet
{

    public void init()
    {
        URL some=Test.class.getClass().getClassLoader().getResource("/assets/pacman.png");
        System.out.println(some.toString());
        System.out.println(some.getFile());
        System.out.println(some.getPath());

    }
}

当我从 Eclipse 运行它时,我得到了错误:

java.lang.NullPointerException
    at Test.init(Test.java:9)
    at sun.applet.AppletPanel.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

类路径(来自 .CLASSPATH 文件)

<classpathentry kind="src" path="src"/>

在我的 c:\project\src 文件夹中,我只有 Test.java 文件和包含 pacman.png 的“assets”目录。

我做错了什么以及如何解决?

【问题讨论】:

    标签: java applet


    【解决方案1】:

    ClassLoader 获取资源时,您不需要在开头使用斜线,因为不知道要从“相对”部分开始。仅当您从 Class 获取资源时才需要它,其中相对路径来自类的包级别。

    此外,您不希望Test.class.getClass() 获得类 Test.class,它将是Class&lt;Class&gt;

    换句话说,尝试以下任一行:

    URL viaClass=Test.class.getResource("/assets/pacman.png");
    URL viaLoader=Test.class.getClassLoader().getResource("assets/pacman.png");
    

    【讨论】:

    • 谢谢。我尝试了这两种方法,但都不起作用,但是现在它在第 10 行(这是第一个 system.out.println 行)而不是第 9 行给出了一个异常。我已经确定并且图像在 project/src/资产...
    • 这意味着“some”为空......这意味着您没有正确获取资源。
    • 是的,我该如何解决呢?是类路径不正确还是我需要更改的其他内容?
    • 尝试将小程序方面排除在外 - 在控制台应用程序中运行相同的代码。
    • 但是我正在构建一个小程序,所以我可以在网络浏览器中运行它,让它成为一个控制台是没有意义的:(。必须有一些方法让它在小程序中工作?小程序如何使用图片?
    【解决方案2】:

    我会这样做:

    final InputStream stream;
    
    stream = Test.class.getResourceAsStream("assets/pacman.png");
    System.out.println("Stream = " + stream);
    

    "/assets/pacman.png" 是绝对位置,而 "assets/pacman.png" 是相对位置。

    【讨论】:

    • 正如预期的那样,因为您的其他尝试没有奏效。类所在的包是什么,.class文件在哪里?
    • 当我在 Eclipse 中运行时,.class 被放在 c:\java\test\bin 中。 .java 位于 c:\java\test\src 中,assets/ 文件夹也在此目录中。现在没有使用任何包,因为我只是想让它适用于我的其他项目。谢谢
    • assets 目录必须是 .class 文件所在的位置
    【解决方案3】:
    • 当您使用.getClass().getResource(fileName) 时,它认为 文件名的位置与调用的位置相同 类。
    • 当你使用.getClass().getClassLoader().getResource(fileName)时 认为文件名的位置是根 - 换句话说 bin 文件夹

    如果该文件实际上不存在,则会点击NullPointerException

    来源:

    package Sound;
    public class ResourceTest {
        public static void main(String[] args) {
            String fileName = "Kalimba.mp3";
            System.out.println(fileName);
            System.out.println(new ResourceTest().getClass().getResource(fileName));
            System.out.println(new ResourceTest().getClass().getClassLoader().getResource(fileName));
    

    输出:

    Kalimba.mp3
    file:/C:/Users/User/Workspaces/MyEclipse%208.5/JMplayer/bin/Sound/Kalimba.mp3
    file:/C:/Users/User/Workspaces/MyEclipse%208.5/JMplayer/bin/Kalimba.mp3
        }
    }
    

    【讨论】:

      【解决方案4】:

      这对我有用:

      URL viaClass=Test.class.getResource("assets/test.html");

      哪些资产与 Test.class 输出文件位于同一文件夹中(经过痛苦的检查和调试)

      【讨论】:

        猜你喜欢
        • 2017-08-12
        • 1970-01-01
        • 2011-04-17
        • 1970-01-01
        • 2014-07-14
        • 1970-01-01
        • 2015-07-04
        • 2021-12-15
        • 2014-12-07
        相关资源
        最近更新 更多