#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
конструктора.