ImageIOに入力ヌル例外を使用して読み取りPNG

ボット平和:

私はの基本的な実装を作成しようとしているパックマンをもちろん私の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++;
    }
}

エラーから(と思う)茎ImageIOPNGファイルを見つけることではありません。私は自分にインポートする必要がありますpacman何とかクラス?何がその場合のインポート構文でしょうか?私は、私は、Eclipse IDEを使用していますし、簡単にするために任意の外部ライブラリを使用しないようにしようとしていますことを言及する必要があります。

編集:

それはすべての場合に役立ちます私はここにもそれらを投稿することができますので、他の2クラスは、現時点ではあまり大きくありません。

編集2:

使用するImageIO.read(pacman.class.getResource("lolface.png"));代わりのImages/lolface.png作品。ありがとう!

rzwitserloot:

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ので、あなたは(ある:使用同じ場所にこのコードが格納されているクラスファイルに格納されているリソース)を達成しようとしているものと一致します。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=362369&siteId=1