首先,这个问题是关于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。 有人可以帮我吗?
以下是源代码
Application.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
}
}
Puzzle.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();
}
GUI.java
...
this.puzzle = new Puzzle(PuzzleConfiguration.getNumOfTiles());
...
答案 0 :(得分:0)
你对异常的含义是完全正确的:
它说当某个变量具有空值时会发生NullPointerException。
你需要做的是查看setNumOfTiles
方法,特别是第45行(整个源文件,而不是方法),看看那里发生了什么。
很可能你使用未初始化的变量 OR 将一个作为参数传递。
祝你好运。答案 1 :(得分:0)
显然,imageArray[1]
包含空值。可能是ImagePanel.getImage()为元素1返回null
,或者numOfTiles&gt; = 1,因此循环不会运行。
你的循环从i和preincrements开始,这意味着没有循环运行i = 1(第一次迭代运行i = 2)。我会用这个表格
for (int i = 1; i <= numOfTiles; i++) {
编辑:
托马斯是对的;那样,numOfTiles太低(1或更少)或ImagePanel.getImage
返回null(缺少资源文件?)
答案 2 :(得分:0)
您已使用空值初始化数组
imageArray = new Image[numOfTiles];
然后通过for循环设置其值
imageArray[i] = ImagePanel.getImage(builder.toString());
但是设置的值为null,当你尝试从null值调用方法时,你会在这一行得到NULLPOINTEREXCEPTION
imageWidth = imageArray[1].getWidth(null);
imageArray [1]包含空值。打电话。在null总是caz NULLPOINTEREXCEPTION