getClassLoader().getResource() 返回 null

问题描述 投票:0回答:5

我有这个测试应用程序:

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
5个回答
23
投票

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

此外,您不需要

Test.class.getClass()
,因为它会获得 Test.class 的 类,这将是 Class<Class>

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

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

8
投票
我会这样做:

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

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


8
投票
    当您使用
  • .getClass().getResource(fileName)
     时,它会考虑
    文件名的位置与调用的位置相同
    类。
  • 当您使用
  • .getClass().getClassLoader().getResource(fileName)
    时
    认为 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 } }
    

1
投票
这对我有用:

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

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


0
投票
我发现“resouces”文件是普通文件类型

然后我的代码工作了

URL url = FileUtility.class.getClassLoader().getResource("test.json");

© www.soinside.com 2019 - 2024. All rights reserved.