getClassLoader (). getResource () возвращает ноль - PullRequest
11 голосов
/ 09 марта 2009

У меня есть это тестовое приложение:

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 (из файла .CLASSPATH)

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

В моей папке c: \ project \ src у меня есть только файл Test.java и каталог 'assets', содержащий pacman.png.

Что я делаю не так и как это исправить?

Ответы [ 4 ]

19 голосов
/ 09 марта 2009

Вам не нужна косая черта в начале при получении ресурса от 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 голосов
/ 09 марта 2009

Я бы сделал это так:

final InputStream stream;

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

"/ assets / pacman.png" - абсолютное местоположение, тогда как "assets / pacman.png" - относительное местоположение.

4 голосов
/ 29 ноября 2011

Нажмите Upvote,

  • Когда вы используете .getClass().getResource(fileName), он учитывает расположение fileName совпадает с местоположением вызывающего класс.
  • Когда вы используете .getClass().getClassLoader().getResource(fileName) это учитывает расположение файла name - это корень - другими словами папка для мусора

Хит 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));

OutPut;

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 голос
/ 26 апреля 2012

Это работает для меня:

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

какие ресурсы находятся в одной папке с выходным файлом Test.class (после неудачной проверки и отладки)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...