У меня есть изображение внутри банки, которое я пытаюсь загрузить, но getResourceAsStream() всегда возвращает значение null.
Структура каталога:
com/thesimpzone/watch_pugs/watch_pugs/{all my class files}
META-INF/MANIFEST.MF
resources/generic/mouse.png
Контент.java:
public abstract class Content {
protected Map<String, BufferedImage> images = new HashMap<String, BufferedImage>();
protected String prefix;
public Content(String prefix){
this.prefix = prefix;
}
protected void loadImage(String name){
System.out.println(name);
System.out.println(prefix);
String path = (prefix + name);
System.out.println(path);
String identifier = name.substring(0, name.lastIndexOf("."));
try{
InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream(path);
images.put(identifier, ImageIO.read(in));
}catch(IOException | ClassCastException e){
throw new RuntimeException("Image " + identifier + " at " + path + " could not be loaded.");
}
}
[...]
}
Общий контент.java:
public class GenericContent extends Content {
public GenericContent(){
super("resources/generic/");
this.loadContent();
}
@Override
public void loadContent() {
loadImage("mouse.png");
}
}
Трассировки стека:
mouse.png
resources/generic/
resources/generic/mouse.png
Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: input == null!
at javax.imageio.ImageIO.read(ImageIO.java:1348)
at com.thesimpzone.watch_pugs.watch_pugs.content.Content.loadImage(Content.java:29)
at com.thesimpzone.watch_pugs.watch_pugs.content.GenericContent.loadContent(GenericContent.java:17)
at com.thesimpzone.watch_pugs.watch_pugs.content.GenericContent.<init>(GenericContent.java:12)
at com.thesimpzone.watch_pugs.watch_pugs.Canvas.<init>(Canvas.java:45)
at com.thesimpzone.watch_pugs.watch_pugs.Framework.<init>(Framework.java:75)
at com.thesimpzone.watch_pugs.watch_pugs.Window.<init>(Window.java:50)
at com.thesimpzone.watch_pugs.watch_pugs.Window.<init>(Window.java:26)
at com.thesimpzone.watch_pugs.watch_pugs.Window$1.run(Window.java:60)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:744)
at java.awt.EventQueue.access$400(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:697)
at java.awt.EventQueue$3.run(EventQueue.java:691)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:714)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
Я понятия не имею, почему загрузчик классов не может найти изображение. Я посмотрел в скомпилированную банку, и файл там, и он отлично открывается в краске, так что с файлом все в порядке. Я пробовал различные варианты ClassLoader, включая getSystemClassLoader(), getClassLoader() и Content.class.getClassLoader(); а также getResourceAsStream(путь) вместо getResource(путь).openStream(). Я пробовал с префиксом «/» в начале и без него, поэтому у меня нет идей, и Google не помогает. Кроме того, кажется, что то, что я делаю, чтобы определить «префикс», очень неудобно, и поэтому, если есть лучший способ, я был бы рад, если бы кто-нибудь показал мне, как это сделать.
Спасибо.
prefix
уже являетсяString
. Нет смысла вызыватьtoString()
для него. - person Sotirios Delimanolis   schedule 12.10.2014