로드하려는 이미지가 내 항아리 안에 있지만 getResourceAsStream()은 항상 null을 반환합니다.getResourceAsStream이 null을 반환하는 이유는 무엇입니까?
디렉토리 구조 :
com/thesimpzone/watch_pugs/watch_pugs/{all my class files}
META-INF/MANIFEST.MF
resources/generic/mouse.png
Content.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.");
}
}
[...]
}
GenericContent.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)
왜 클래스 로더가 이미지를 찾을 수 없는지 나는 모른다. 나는 컴파일 된 jar 파일을보고 파일이 존재하고 파일이 잘되도록 페인트가 잘 열립니다. getSystemClassLoader(), getClassLoader() 및 Content.class.getClassLoader()를 포함하여 다양한 ClassLoader 변형을 시도했습니다. getResource (path) .openStream() 대신 getResourceAsStream (path)을 사용하십시오. 접두어에 '/'를 붙이지 않고 시도 했으므로 아이디어가 다 빠져서 Google이 도움이되지 못합니다. 또한, '접두어'를 정의하는 일이 매우 어색하고 더 나은 방법이 있다면 누군가 내가 어떻게 보여 주 었는지 기뻐할 것 같습니다.
감사합니다.
사이드 노트 :'prefix'는 이미'String'입니다. 거기에'toString()'을 호출하는 것은 아닙니다. –
오, 그래, 내가 char []를 사용하려 할 때부터 최종 수 있습니다. –
다음 번에 제안 할 내용으로 원래 코드를 재정 의하여 질문을 편집하지 마십시오. 그것은 답을 오도합니다. 필요한 경우 시도중인 새 코드와 결과를 추가하여 편집하십시오. –