当我将这个指针推到Deque / ArrayList上时,为什么我得到一个NullPointerException,当它显然不是Null时

时间:2013-03-18 07:14:30

标签: java recursion nullpointerexception depth-first-search

所以我想尝试做一个简单的迷宫求解器(深度优先)。我不希望帮助解决递归方法,但由于某种原因,这会导致NullPointerException在ArrayList的.add单元上进行修复,任何人都可以帮助我知道原因吗? (MazeExample类由我的老师提供了一个简单的迷你指针N S E W,因此我们可以尝试测试我们的代码。)

public static void main(String[] args)
{
    MazeSolver solver = new MazeSolver();
    ExampleMaze example = new ExampleMaze();

    System.out.println(solver.stepsToSolveMaze(example.getStart()));    

}

这是主要的,这里是MazeSolver对象(截至目前它只计算结束时的移动次数,一次一步)。

public class MazeSolver 
{
private int steps=0;
private ArrayList<MazeCell> visitedCells;
private Deque<MazeCell> breadCrumbs;

public int stepsToSolveMaze(MazeCell cell)
{
    visitedCells.add(cell); //this is where the exception is getting thrown.
    breadCrumbs.push(cell);

    if (cell.isFinish())
    {
        return 1;
    }


    if (cell.east() != null && !visitedCells.contains(cell.east()))
    {
        steps += stepsToSolveMaze(cell.east());
    }
    if (cell.south() != null && !visitedCells.contains(cell.south()))
    {
        steps += stepsToSolveMaze(cell.south());
    }
    if (cell.west() != null && !visitedCells.contains(cell.west()))
    {
        steps += stepsToSolveMaze(cell.west());
    }
    if (cell.north() != null && !visitedCells.contains(cell.north()))
    {
        steps += stepsToSolveMaze(cell.north());
    }
    else
    {
        steps--;
        stepsToSolveMaze(breadCrumbs.pop());            
    }

    return steps;

}

2 个答案:

答案 0 :(得分:1)

在您的示例中,从未设置visitedCells,因此当您尝试向其添加项时,会导致NullPointerException。您需要在使用它之前对其进行初始化:

visitedCells = new ArrayList<MazeCell>();

另一方面,breadCrumbs也会遇到同样的问题,所以你应该在你的时候初步确定它:

breadCrumbs = new Deque<MazeCell>();

答案 1 :(得分:1)

您没有初始化数组列表。

在stepsToSolveMaze

中添加以下内容
visitedCells = new ArrayList<MazeCell>();

然后添加元素