Java: исключение NullPointerException из class.getResource ( … )

#java #classpath

#java #путь к классу

Вопрос:

Я писал небольшое приложение, и когда я пытался создать ImageIcon, я всегда получал исключение. Исключение было вызвано этой строкой кода:

 prayerLevel.setIcon(new ImageIcon(getClass().getResource("/icons/icon_prayer.png")));
  

Теперь в моей программе папка / icons / действительно существует. Я не знаю, имеет ли это значение, но файл класса находится внутри пакета, где, поскольку папка icons находится в папке проекта (когда вы бы увидели папку bin и src).

Я немного поискал вокруг и не смог найти решение, которое могло бы помочь мне решить проблему. Возможно, кто-нибудь из вас, ребята, мог бы помочь?

Редактировать: кто-то запросил мою иерархию папок:

Иерархия папок

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

Правка 2:

 System.out.println(getClass().getResource("/icons/icon_prayer.png") == null);
  

Выводит значение true.

Комментарии:

1. как выглядит иерархия папок? Когда вы говорите, что папка /icons существует, где именно она находится?

2. Вероятно, вам следует включить соответствующее сообщение об ошибке — в частности, трассировку стека, — поскольку это покажет нам, где именно возникает проблема.

3. Я понял, почему я получаю NullPointer, но теперь я не могу понять, почему class.getResource(… ) имеет значение null. Файл icon_prayer.png находится в папке icons.’

4. находится ли папка icons в пути к классу при запуске приложения?

5. NPE не от Class.getResource() , вопреки вашему названию. Это результат вашей неспособности проверить результат.

Ответ №1:

Я полагаю, что NPE выбрасывается из ImageIcon конструктора при getResource возврате null .

Попробуйте следующее:

 getClass().getClassLoader().getResource("/icons/icon_prayer.png")
  

Или:

 ClassLoader.getSystemResource("/icons/icon_prayer.png")
  

Комментарии:

1. Я попробовал getClass ().getClassLoader().getResource(«/icons /icon_prayer.png»), никаких изменений

2. @Martin Tuskevicius: Я добавил другой метод извлечения — попробуйте!

Ответ №2:

Насколько я знаю, getResource() будет проверяться расположение известных ресурсов, другими словами, если папка /icons/ не рассматривается как папка ресурсов, это будет не так, как вы ожидали. Насколько я знаю, есть два способа обойти это:

1) Установите папку icons в качестве ресурса для приложения, затем вы можете использовать getResource() , например URL css_url = getClass().getResource("/resource/style.css");

Для получения дополнительной информации об этой опции см. http://lj4newbies.blogspot.com/2008/03/using-classgetresource-load-resource.html

2) Получите значок как обычный файл без использования getResource() метода. На самом деле это рекомендуется в руководствах Swing по собственной документации Sun / Oracle .

Как правило, приложения предоставляют свой собственный набор изображений, используемых как часть приложения, как и в случае с изображениями, используемыми многими нашими демонстрационными версиями. Для получения пути к изображению следует использовать метод Class getResource. Это позволяет приложению проверить, что изображение доступно, и обеспечить разумную обработку ошибок, если это не так. Когда изображение не является частью приложения, не следует использовать getResource и напрямую используется конструктор ImageIcon. Например:

Значок ImageIcon = новый значок ImageIcon(«images/middle.gif «, «симпатичный, но бессмысленный шлепок»);

Надеюсь, это поможет, удачи!

Ответ №3:

Старый поток, но поскольку я только что столкнулся с аналогичной проблемой…

Я использую Eclipse и скопировал файл в папку «ресурсы» с помощью системных команд ( cp ). Однако eclipse выдал NullPointerException , потому что я не обновил папку «ресурсы». Итак, файл был там, но Eclipse его не видел.

Итак, в Eclipse: «Проводник пакетов» -> «ресурсы» -> Щелкните правой кнопкой мыши -> обновить. Это исправило это для меня.

Комментарии:

1. То же самое исправление здесь для IntelliJ IDEA: Build-> «Rebuild project» сделало свое дело.

Ответ №4:

Я добавил свою музыку, изображения и т.д. В папку, добавленную в путь сборки. Затем я просто использовал

 URL url="CurrentClass".class.getClassLoader().getResource("media file name not the path");
setIconImage(new ImageIcon(url.getPath()).getImage());
  

чтобы установить значок изображения.

Комментарии:

1. Это сделало свое дело. Я добавил свои ресурсы / папку данных в путь к классу, но я просто использовал class.getResource вместо class.getClassLoader().getResource. Который не работает, если вы находитесь в пакете по умолчанию.

2. Хорошая статья для этого здесь howtodoinjava.com/java/io/read-file-from-resources-folder

Ответ №5:

Единственное, что может вызвать a NullPointerException в этой строке кода, — это первая . , что означает, что prayerLevel равно null.

Комментарии:

1. Это неправда. Конструктор ImageIcon(URL) выдаст NPE, если предоставленный URL-адрес равен null, поскольку реализация просто: public ImageIcon(URL location) { this(location, location.toExternalForm()); }

2. Но тогда исключение NullPointerException вызывается не (напрямую) этой строкой, а некоторой строкой из конструктора.

3. Это спорный вопрос. В любом случае, это было бы понятно, если бы OP включал трассировку стека. Примечание к OP: включите соответствующее сообщение об ошибке!

4. URL, предоставленный в качестве аргумента для конструктора, равен null.

5. Вы правы, отсюда и NPE из ImageIcon конструктора.