我一直在使用NullPointerExceptions遇到问题,所以我想我可以使用一些很好的解释。
游戏或许不完整,因为我的作业需要,但作为额外的我想添加撤消逻辑。
我以为我可以实现一个堆栈来保存Level对象,然后在玩家想要撤消他们的移动时弹出它。接下来我将使用toString方法创建一个新级别,该方法将Level对象作为String返回,然后可以使用该方法将另一个Level添加到堆栈中。
我猜Level b = new xx
是错误的,而新的xx等于null ...
这是我的代码:
public class Sokoban {
private Level level;
private Scanner sc = new Scanner(System.in);
private Deque moves;
public Sokoban(){
//initialize level. PS Klarer du denne er du god!!
moves = new ArrayDeque();
moves.push(new Level(" ######\n #@# #\n ###$ #\n### $$ #\n#. $ ##\n#.. $# # \n#.# #### \n#.#### \n### "));
level = (Level) moves.peek();
level.display();
}
public void run(){
while(true){ //!level.finished()
String nextInput = sc.next();
if (nextInput.equals("r")){
Level a = (Level) moves.pop();
level = new Level(a.toString());
level.display();
moves.push(level);
}
Level b = (Level) moves.peek();
level = new Level(b.toString());
level.move(nextInput);
level.display();
moves.push(level);
}
//System.out.println("Congratulations, you did it!");
}
public static void main(String[] args) {
Sokoban sokoban = new Sokoban();
sokoban.run();
}
}
EDIT2:http://pastebin.com/0ChHwkgH完整代码,3个课程。 http://gyazo.kennethd.net/i/PPzJC.png - 控制台电话
答案 0 :(得分:1)
您应该检查以下两件事:
1)对Deque使用泛型:
private Deque<Level> moves = new ArrayDeque<Level>();
//etc...
2)确保在Level中覆盖 toString() -method,以便该级别在类似于构造函数中使用的String中返回其表示形式:
new Level(" ######\n #@# #\n ###$ #\n### $$ #\n#. $ ##\n#.. $# # \n#.# #### \n#.#### \n### ");
修改强>
while(true){ //!level.finished()
String nextInput = sc.next();
if (nextInput.equals("r")){
Level a = (Level) moves.pop();
level = new Level(a.toString());
level.display();
moves.push(level);
}
// It is possible that peek returns null (it's the case if the deque is empty)
// but this should only be an hint
Level b = (Level) moves.peek();
level = new Level(b.toString());
level.move(nextInput);
level.display();
moves.push(level);
}
我认为主要的问题是,计算字段行数和列数的方法失败了,因此跳过了Level-class中workerLocation-array的初始化。因此,如果您尝试在第一次出现空指针异常时访问它。尝试在Level-class中获取行amd列的值。