私はの基本的な実装を作成しようとしているパックマンをもちろん私のJava用、ちょうど(今のところ)の移動作業を取得するためのテストプロジェクトを作成しました。私は移動しようとするつもりだJLabel
パネルを越え、とのアイコンを設定しようとしていますJLabel
、私はプロジェクトにロードされてきたことをPNGファイルであることを。PNGファイルは、名前のフォルダ内にある画像、およびすべての私の他のクラスはしているのsrc同じプロジェクト内のフォルダ。私は私のPNGファイルを読み込むしようとするのsrcフォルダクラスIには、次のエラーを取得します:
Exception in thread "main" java.lang.IllegalArgumentException: input == null!
at java.desktop/javax.imageio.ImageIO.read(ImageIO.java:1400)
at pacman.<init>(pacman.java:16)
at screen.<init>(screen.java:9)
at driver.main(driver.java:6)
driver
作成しscreen
、次いで生成したオブジェクトpacman
のオブジェクトとの誤差点pacman
以下であるクラス:
import java.awt.Point;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
public class pacman {
Point pacLoc= new Point(0,0);
Direction pacDir=Direction.RIGHT;
int pacLives;
static int count=1;
int pacID;
BufferedImage pactest;
@SuppressWarnings("unused")
pacman(){
pacID=count;
switch(pacID) {
case 1:
try {
pactest=ImageIO.read(getClass().getResource("Images/lolface.png"));
} catch(IOException a1) {
a1.printStackTrace();
}
pacLoc.setLocation(100,100);
break;
case 2:
try {
pactest=ImageIO.read(getClass().getResource("Images/whyface.png"));
} catch(IOException a1) {
a1.printStackTrace();
}
pacLoc.setLocation(100,200);
break;
}
count++;
}
}
エラーから(と思う)茎ImageIO
PNGファイルを見つけることではありません。私は自分にインポートする必要がありますpacman
何とかクラス?何がその場合のインポート構文でしょうか?私は、私は、Eclipse IDEを使用していますし、簡単にするために任意の外部ライブラリを使用しないようにしようとしていますことを言及する必要があります。
編集:
それはすべての場合に役立ちます私はここにもそれらを投稿することができますので、他の2クラスは、現時点ではあまり大きくありません。
編集2:
使用するImageIO.read(pacman.class.getResource("lolface.png"));
代わりのImages/lolface.png
作品。ありがとう!
getClass().getResource()
間違っています; 正しい構文は次のとおりであるpacman.class.getResource(...)
ところpacman
、独自のクラス名が*です。
第二の点は、お使いの例外処理が壊れています。例外は4便利なもの(タイプ、メッセージ、スタックトレース、および因果連鎖)が含まれています。
あなたは離れて4つの物事の3アウトを投げています。それをしないでください。実際にそれに対処(ロギングや印刷エラーがされるか、NOT、それに対処する!)、または以降それを投げる(PUT throws IOException
あなたのメソッド/コンストラクタシグネチャ上)、またはそれには良いことだしない場合のいずれか、で行くcatch (Whatever e) { throw new RuntimeException(e); }
素晴らしいされていないが、Aの一体多くの方よりe.printStackTrace()
。
あなたは、インポート何もする必要はありません。インポートはタイプ名をエイリアシングされる(import com.foo.Bar;
手段:このファイルにいつでもどこでもがBar
書かれており、種類を示しているが、それは読んで想像するcom.foo.Bar
代わりに、それもないロードバークラスメモリーにもその中の任意のコードを実行し、それは資源とは何の関係もありません。)。
エラーのスタックトレースがなければ、私たちはあなたを助けることはできません。
IFそれが始まるとその行にNullPointerExceptionがあるcase 1
かで始まる行case 2
リソースが見つからなかったので、はい、それはです。
あなたは上記の問題を修正しましたと仮定すると、(pacman.class.getResource
代わりにgetClass().getResource
)、これはまだ起こっている:のgetResourceが動作する方法は、それが含まれているディレクトリからの相対見えることであるpacman.class
と述べたクラスがJARファイル内の、たとえば、ある場合でも...。だから、あなたが持っている場合は、言う、/home/BotFred/workspace/com.botfred.pacman/build/com/botfred/pacman/pacman.class
、そして、それは画像がであることを期待します/home/BotFred/workspace/com.botfred.pacman/build/com/botfred/pacman/Images/lolface.png
。
あなたはかなり確実パックマンクラスがからロードされている場所でないなら、あなたは常に見つけるためにこれを行うことができます。
System.out.println(pacman.class.getResource("pacman.class"));
印刷結果は次のようになりますfile:///home/BotFred/workspace/com.botfred.pacman/build/com/botfred/pacman/pacman.class
か、おそらくjar:file:///home/BotFred/pacman.jar!com/foo/botfred/pacman.class
瓶がどこにあるかを示している(と、瓶がちょうどあるとして、それの中に、その場所、ファイルを圧縮、それはその後、COM / fooの/ botfred /画像/ lolfaceでその瓶の内側になります。あなたのイメージのためのPNG。
*)理由は、のgetClass()はオブジェクトのインスタンスの実際の型によってではなく、あなたが見ている非常にコードで行くということです。あなたがサブクラス化するのであれば、物事を破ります。おそらく、パックマンは、現在、サブクラス化されていませんが、キーワードは現在あり。たぶん1日それがあります。それは突然のすべてを壊す場合は吸うと思います。ベストgetgoから良い習慣を学びます。いつも使うmyclassname.class.getResource
ので、あなたは(ある:使用同じ場所にこのコードが格納されているクラスファイルに格納されているリソース)を達成しようとしているものと一致します。