Sokoban项目中的NullPointerException - Java - OOP

时间:2014-02-13 22:42:17

标签: java oop object nullpointerexception stack

我一直在使用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 - 控制台电话

1 个答案:

答案 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列的值。