-1

首先,这个问题是关于 15-Puzzle 的。我正在尝试学习如何用 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)

我已经尝试追踪错误,谷歌搜索,但我仍然找不到解决方案。它说当某些变量具有空值时会发生 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
    }
}

拼图.java

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();
}

图形用户界面.java

...

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

...
4

3 回答 3

0

显然,imageArray[1]持有一个空值。可能是 ImagePanel.getImage() 返回null元素 1,或者 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 回答
0

你已经用空值初始化了数组

imageArray = new Image[numOfTiles];

然后通过for循环设置它的值

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

但是设置的值是空的,当你尝试从空值调用方法时,你会在这一行得到 NULLPOINTEREXCEPTION

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

imageArray[1] 包含空值。打电话。在 null 上总是 caz NULLPOINTEREXCEPTION

于 2012-05-03T09:04:52.200 回答
0

您对异常的含义是完全正确的:

它说当某些变量具有空值时会发生 NullPointerException。

您需要做的是查看setNumOfTiles方法,特别是第 45 行(整个源文件,而不是方法),看看那里发生了什么。

很可能您正在使用未初始化的变量将一个变量作为参数传递。

祝你好运。

于 2012-05-03T09:02:15.510 回答