2017-12-04 3 views
0

Java에서 LWJGL 3 용 텍스처 클래스를 빌드 해 봅니다.getSystemResource (..)를 사용하는 NullPointerException

내 loadTexture 기능은 다음과 같습니다 :

public static Texture loadTexture(String filename) { 
     int id = -1; 

     try { 
      File texture = new File(filename); 

      if (!texture.exists()) { 
       System.err.println("File '" + filename + "' does not exist."); 
       return null; 
      } 

      // crash in following line 
      InputStream stream = ClassLoader.getSystemResource(filename).openStream(); 
      PNGDecoder decoder = new PNGDecoder(stream); 

      // Some code between here 

      return new Texture(id, new Vector2i(decoder.getWidth(), decoder.getHeight())); 
     } catch (IOException e) { 
      e.printStackTrace(); 
      return new Texture(id, new Vector2i()); 
     } 
    } 

을 스택 트레이스는 다음입니다 :

Exception in thread "main" java.lang.NullPointerException 
    at org.citynopolisproject.graphics.Texture.loadTexture(Texture.java:49) 
    at org.citynopolisproject.Game.<init>(Game.java:30) 
    at org.citynopolisproject.Game.<init>(Game.java:33) 
    at org.citynopolisproject.Game.main(Game.java:188) 

파일의 위치는 다음과 같습니다 citynopolisproject/고해상도/splash.png과의 소스 파일 Texture.java (필요한 경우)는 citynopolisproject/src/org/citynopolisproject/graphics에 저장됩니다.

하지만 왜 충돌이 발생하는지 알 수 없으며 NPE를 throw합니다. 아이디어가 있으십니까?

인사말

+0

[NullPointerException이란 무엇이며 어떻게 수정합니까?] (https://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix -it) – jrook

+0

분명히 아닙니다. 나는 그들을 어떻게 다룰 지 안다. 그러나 ClassLoader.getSystemResource ("여기 기존 파일")에 오류가 있어야하며, Texture.class.getResourceAsStream() 및 Texture.class.getClassLoader(). getResourceAsStream (filename)도 시도했습니다. 그러나 위의 코드는 less stacktrace를주었습니다. –

+0

'FileInputStream (texture)'을 이미 파일이 존재했는지 확인 했으니 까? – Izruo

답변

0

문제는 (내가 suspsect) ClassLoader.getSystemResource(filename)가 null 반환한다는 것입니다. 찾으려는 파일이 클래스 경로에 없거나 클래스 로더가 참조하는 이름으로 자원을 찾을 수 없기 때문일 수 있습니다.

프로젝트의 구조에 대해 더 자세히 알아야 할 필요가 있습니다. 이 파일은 어디에서 찾고 있으며 Jar 파일에서 실행 중입니까?

클래스 경로에서 리소스를 참조하는 방법에 대한 자세한 정보를 찾아야 할 수도 있습니다. 그리고 항아리를 만들면 new File(filename)으로 정상적으로 참조 할 수 없다는 것을 기억하십시오.

편집

당신은 대부분이 클래스 경로에서 자원을 점점 무시하고 싶지 않아요. 만약 당신이이 프로그램을 jar로 갈 예정이라면, 그것은 jarred 된 후에도 작동 할 것입니다.

+0

질문의 코멘트 섹션에서 언급했듯이 다음과 같이 인용 할 수 있습니다. " \t "res/splash.png "가 포함 된 새 문자열을 전달합니다. 파일의 위치는 citynopolisproject/res/splash.png이며 다음 소스 파일이 있습니다. Texture.java (필요하다면)는 citynopolisproject/src/org/citynopolisproject/graphics에 저장되어 있습니다.하지만 그게 왜 문제가되는지 궁금합니다. 다른 창 (png)에 대해 동일한 경로를 사용하여 창 아이콘을 변경했습니다. " classpath의 사용을 피할 수 있습니까? 클래스 패스를 우회하는 다른 함수가 있습니까? –

+0

@DanielH이 경로를 포함하도록 질문을 편집하십시오. 핵심 정보는 질문이 아닌 주석에 포함되어야합니다. – xtratic

+0

예, 'ClassLoader.getSystemResource (filename);'는 실제로 null을 반환합니다. –

관련 문제