Почему class.getResource() продолжает возвращать значение null, хотя по указанному пути есть ресурс?

Мне интересно, почему метод getResource продолжает возвращать null, у меня есть следующая настройка:

public static URL getResource(String path){
    URL url = ResourceLoader.class.getResource(path);
    if (Parameters.DEBUG){
        System.out.println(path);
    }
    return url;
}

Моя структура проекта в Eclipse выглядит следующим образом:

-- res
  -- img

Переменная path, которую я передаю в getResource, имеет значение "/res/img" или "/res/img/smile.png". Тем не менее, метод продолжает возвращать null, а url не установлен. Я также следовал инструкциям этот вопрос, которые должны были добавить папку в проект classpath через Запустить конфигурации, но безуспешно... Кто-нибудь знает, что я делаю неправильно?

введите здесь описание изображения


person nburk    schedule 23.03.2015    source источник


Ответы (2)


Краткий ответ: используйте "/img/smile.png".

На самом деле происходит то, что любой путь, начинающийся с /, заданный методу Class.getResource, всегда рассматривается как относящийся к каждой записи в пути к классам.

Как показывает ваш снимок экрана, каталог res является такой записью пути к классам. Таким образом, метод Class.getResource рассматривает указанный вами путь как относительный к этой записи. Значение относительно каталога res.

Итак, метод объединяет ваш строковый аргумент с этим каталогом, что приводит к res/res/img/smile.png. Поскольку в этом месте нет файла (ресурса), он возвращает значение null.

person VGR    schedule 23.03.2015
comment
Отличное объяснение! :) - person Vivin; 07.07.2016

http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#getResource(java.lang.String)

Правила поиска ресурсов, связанных с данным классом, реализуются определяющим загрузчиком класса класса. Этот метод делегирует загрузчику класса этого объекта. Если этот объект был загружен загрузчиком классов начальной загрузки, метод делегируется ClassLoader.getSystemResource(java.lang.String). Перед делегированием абсолютное имя ресурса создается из заданного имени ресурса по следующему алгоритму:

Если имя начинается с '/' ('/'), то абсолютным именем ресурса является часть имени, следующая за '/'.

В противном случае абсолютное имя имеет следующую форму: модифицированное_имя_пакета/имя Где модифицированное_имя_пакета — это имя пакета этого объекта с заменой '/' на '.' (">").

person Stefaan Neyts    schedule 23.03.2015
comment
Спасибо за ответ! так что, если правильно понять, в моем случае применимо следующее: If the name begins with a '/' ('\u002f'), then the absolute name of the resource is the portion of the name following the '/'. а почему тогда это не валидный ресурс? - person nburk; 23.03.2015
comment
Самый простой способ понять это использовать getResource() с пустой строкой. Это даст вам URL-адрес пакета, в котором находится ваш класс. Затем просто введите этот URL-адрес, и вы все поймете. - person Stefaan Neyts; 23.03.2015