Java getClassLoader().getResource()返回null

Java getClassLoader().getResource()返回null,java,applet,Java,Applet,我有这个测试应用程序: 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.p

我有这个测试应用程序:

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文件)


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


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

类加载器
获取资源时,在开始时不需要斜杠,因为不知道要从“相对”部分开始。只有当您从
获取资源时,才需要它,相对路径从类的包级别开始

此外,您不需要
Test.class.getClass()
,因为它将获得Test.class的类,它将是
class

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

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

我会这样做:

final InputStream stream;

stream = Test.class.getResourceAsStream("assets/pacman.png");
System.out.println("Stream = " + stream);
“/assets/pacman.png”是绝对位置,“assets/pacman.png”是相对位置。

  • 使用
    .getClass().getResource(文件名)
    时,它会考虑 文件名的位置与调用文件名的位置相同 班级
  • 当您使用
    .getClass().getClassLoader().getResource(文件名)
    时 认为文件名的位置是根,换句话说 垃圾箱文件夹
如果文件实际上不存在,它会点击
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
    }
}
这对我很有用:

URL viaClass=Test.class.getResource(“assets/Test.html”)


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

谢谢。我尝试了这两种方法,但都不起作用,但是现在它在第10行(这是第一行system.out.println)而不是第9行给出了一个异常。我已经确定图像在project/src/assets中…这意味着“some”为空。。。这意味着您没有正确获取资源。是的,那么我如何解决它?类路径是否不正确或我需要更改其他内容?请尝试将小程序方面的内容从等式中去掉-在控制台应用程序中运行相同的代码。但我正在构建一个小程序,以便在web浏览器中运行它,将其设为控制台是毫无意义的:(.必须有某种方法使其在小程序中工作?小程序如何使用图像?正如预期的那样,考虑到您的其他尝试都不起作用。类所在的包是什么?类文件在哪里?当我在eclipse中点击run时,.class放在c:\java\test\bin中。java在c:\java\test\src中,资产/文件夹也在中现在没有使用这个dir.No包,因为我只是想让它为我的另一个项目工作。谢谢assests dir需要在.class文件所在的位置
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
    }
}