私は zetcode Snake Javaゲームチュートリアル に従っていて、常にこのエラーが発生します。
ImageIcon iid = new ImageIcon(this.getClass().getResource("ball.png"));
ball = iid.getImage();
Exception in thread "main" Java.lang.NullPointerException
at javax.swing.ImageIcon.<init>(Unknown Source)
at snake2.Board.<init>(Board.Java:52)
at snake2.Snake.<init>(Snake.Java:10)
at snake2.Snake.main(Snake.Java:22)
実際にコードをコピーして貼り付け、どのように機能するかを確認しました。それらも適切なパッケージに入っています。しかし、実行しようとすると、常にこのエラーが発生します。
イメージは、コンパイルされたクラスと同じパッケージ(OS用語ではフォルダー)にある必要があります。同じフォルダに_.class
_と_.png
_の両方があるかどうかを確認します。そうでない場合は、_/
_で始まるgetResource(..)
でクラスパス相対パスを使用できます。
これを試して:
ImageIcon iid = new ImageIcon(this.getClass()
.getClassLoader().getResource("ball.png"));
ball = iid.getImage();
画像がJavaファイルと同じフォルダにあることを確認してください。
System.out.println(System.getProperty("Java.class.path"));
を使用して、.classファイルの場所を確認し、このフォルダーに画像を配置してください。
相対パスを使用してリソースを読み込むことは一般的に危険です。常に絶対パスを使用することをお勧めします。
/ball.png
画像がクラスパスのルートにある場合、または場所へのパスを追加します。
画像ファイル(ball.png)をクラスパスに入れる必要があります。詳細は Javadoc をご覧ください。
Eclipseで[プロジェクト]> [クリーン]に移動すると、パッケージエクスプローラーが更新され、この問題は発生しなくなります。
画像のパスのみ使用できます。これはあなたに役立つと思います:これを使用してください:
ImageIcon iid = new ImageIcon("C:\\Users\\ranig\\My\\spaceinvaders\\ball.png");
注:C:\\Users\\ranig\\My\\spaceinvaders\\ball.png
は、ball.png画像のパス全体です。
これの代わりに:
ImageIcon iid = new ImageIcon(this.getClass().getResource("ball.png"));
注:uがスネークコードのみを試し、出力のみを取得する場合。
次のようなビルドリソースにファイルを追加する必要がある場合があります。
<build>
<resources>
<resource>
<directory>path\to\resources</directory>
<includes>
<include>ball.png</include>
</includes>
</resource>
</resources>
リソースがクラスパスにある場合は、「this.getClass()。getClassLoader()。getResource( "ball.png")」を試す必要があります。実際のコードが機能するためには、ball.pngが.classファイルがある場所(つまり、パッケージ内)にある必要があります。
私はあなたのためにそれを簡単にします。次に例を示します。
Icon bug = new ImageIcon(getClass().getResource("bug1.png"));
ここで「bug1.png」はリソースであり、使用できない場合は、ここで説明したようにエラーが発生する可能性があります。
プログラムが存在する同じディレクトリにイメージをインポートします。
また、それに完全なパスを与えることもできます
ImageIcon(getClass().getResource("C://me/file/bug1.png"));