代码之家  ›  专栏  ›  技术社区  ›  Brandon Ross Pollack

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

  •  0
  • Brandon Ross Pollack  · 技术社区  · 13 年前

    所以我尝试做一个简单的迷宫解算器(深度优先)。我不想帮助解决递归方法,但由于某种原因,这会导致单元格的ArrayList的.add上出现NullPointerException,有人能帮我知道为什么吗?(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 回复  |  直到 13 年前
        1
  •  1
  •   Mohan Raj B    13 年前

    您没有初始化数组List。

    在步骤中添加以下内容ToSolveMaze

    visitedCells = new ArrayList<MazeCell>();
    

    然后添加元素

        2
  •  1
  •   Sinkingpoint    13 年前

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

    visitedCells = new ArrayList<MazeCell>();
    

    在另一点上,breadCrumbs也会有同样的问题,所以你可能应该在进行初始化时进行初始化:

    breadCrumbs = new Deque<MazeCell>();