2017-12-04 15 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/RES/splash.pngとのソースファイルTexture.java(必要な場合)はcitynopolisproject/src/org/citynopolisproject/graphicsに保存されます。

しかし、なぜそれがクラッシュしてNPEをスローするのか分かりません。 アイデアはありますか?

挨拶

+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)も試しました。しかし、上記のコードではstacktraceを少なくしました –

+0

あなたはすでにファイルが存在することを確認したので、 'new FileInputStream(texture)'はどうですか? – Izruo

答えて

0

問題(私はsuspsect)ClassLoader.getSystemResource(filename)がnullを返すされていることです。これは、探しているファイルがクラスパス上にないか、クラスローダーが参照する名前でリソースを見つけることができないためです。

あなたのプロジェクトの構造についてもっと知る必要があります。このファイルはどこにありますか?Jarファイルで実行されていますか?

クラスパスでリソースを参照する方法の詳細を調べる必要があるかもしれません。そして、あなたが一度瓶を作ると、それは通常new File(filename)とそれを参照することができないことを忘れないでください。あなたが最も可能性が高いというクラスパスから、あなたのリソースを取得してバイパスする必要はありません

EDIT

。あなたが今このプログラムをjarしようとしているなら、あなたはjarredされた後でさえも動作する何かを使うべきです。

+0

質問のコメント欄で述べたように、私は次のように引用しています: " \t " res/splash.png "を含む新しい文字列を渡します。ファイルの場所はcitynopolisproject/res/splash.pngです。 Texture.java(必要な場合)はcitynopolisproject/src/org/citynopolisproject/graphicsに保存されていますが、それがなぜ問題になるのだろうか、私は同じパス(別のPNG用)を使用してウィンドウアイコンを変更しました。クラスパスの使用を避けることは可能ですか?クラスパスをバイパスする別の関数がありますか? –

+0

@DanielHこれらのパスを含めるためにあなたの質問を編集してください。重要な情報はコメント自体ではなく、コメントに含まれるべきです。 – xtratic

+0

はい、 'ClassLoader.getSystemResource(filename);'は実際にはnullを返します。 –

関連する問題