-1

まず、この質問は15パズルについてです。そして、Java言語でコーディングする方法を学ぼうとしています。

私は自分の大学で IDA* アルゴリズムについて人工知能を勉強する必要があり、Brian Borowski による次のリンクを見つけました: http://brian-borowski.com/Software/Puzzle/はかなり良いリンクでしたが、エラーが発生しました。 Eclipseで手動でビルドしようとしているとき。

誰でも私を助けることができますか?次のようなエラーが表示されました。

Exception in thread "main" java.lang.NullPointerException
    at Puzzle.setNumOfTiles(Puzzle.java:45)
    at Puzzle.<init>(Puzzle.java:25)
    at GUI.<init>(GUI.java:196)
    at Application.<init>(Application.java:19)
    at Application.main(Application.java:27)

私はすでにエラーを追跡し、グーグル検索を試みましたが、それでも解決策を見つけることができません. 一部の変数にnull値がある場合、NullPointerExceptionが発生するとのことでした。ここで誰か助けてくれませんか?

ここにソースコードがあります

アプリケーション.java

public class Application {

    /**
     * Default constructor.
     * Creates an instance of the gui.
     */
    public Application() {
        ApplicationStarter appStarter = null;
        new GUI(appStarter); // Line 19
    }

    /**
     * Main method.
     * Creates an instance of the application.
     */
    public static void main(final String[] args) {
        new Application(); // Line 27
    }
}

パズルジャバ

public Puzzle(final int numOfTiles) {
    super();
    setNumOfTiles(numOfTiles); // Line 25
    setSize(panelWidth, panelHeight);
    setDoubleBuffered(true);
}

public void setNumOfTiles(final int numOfTiles) {
    this.numOfTiles = numOfTiles;
    dimension = (int)Math.sqrt(numOfTiles);
    imageArray = new Image[numOfTiles];
    final String file = "images/" + (numOfTiles - 1) + "-puzzle/shrksign_";
    imageArray[0] = null;
    for (int i = 1; i < numOfTiles; ++i) {
        final StringBuilder builder = new StringBuilder(file);
        if (i <= 9) {
            builder.append("0");
        }
        builder.append(Integer.toString(i));
        builder.append(".gif");
        imageArray[i] = ImagePanel.getImage(builder.toString());
    }
    imageWidth  = imageArray[1].getWidth(null); // Line 45
    imageHeight = imageArray[1].getHeight(null);
    panelWidth  = imageWidth * dimension;
    panelHeight = imageHeight * dimension;
    state = new byte[numOfTiles];
    sleepMs = 500 / imageWidth;
    animationDone = true;
    resetOrder();
}

GUI.java

...

this.puzzle = new Puzzle(PuzzleConfiguration.getNumOfTiles());

...
4

3 に答える 3

0

null値で配列を初期化しました

imageArray = new Image[numOfTiles];

次に、forループを介してその値を設定します

imageArray[i] = ImagePanel.getImage(builder.toString());

ただし、設定されている値はnullであり、null値からメソッドを計算しようとすると、この行でNULLPOINTEREXCEPTIONが取得されます。

 imageWidth  = imageArray[1].getWidth(null);

imageArray[1]にはnull値が含まれています。呼び出します。nullでは常にcazNULLPOINTEREXCEPTION

于 2012-05-03T09:04:52.200 に答える
0

あなたは例外の意味について完全に正しいです:

一部の変数にnull値がある場合、NullPointerExceptionが発生するとのことでした。

必要なことは、setNumOfTilesメソッド、特に 45 行目 (メソッドではなくソース ファイル全体) を見て、そこで何が起こっているかを確認することです。

ほとんどの場合、初期化されていない変数を使用しているか、変数を引数として渡しています。

幸運を。

于 2012-05-03T09:02:15.510 に答える
0

明らかにimageArray[1]、null 値を保持します。要素 1 に対してImagePanel.getImage() が返されるかnull、numOfTiles >= 1 でループが実行されない可能性があります。

ループは i で開始し、プリインクリメントします。これは、i = 1 で実行されるループがないことを意味します (最初の反復は i = 2 で実行されます)。このフォームを使用します

for (int i = 1; i <= numOfTiles; i++) {

編集:

トーマスは正しいです。numOfTiles が小さすぎる (1 以下) かImagePanel.getImage、null を返す (リソース ファイルが見つからない?)

于 2012-05-03T09:03:39.757 に答える