1

我一直让这个索引越界异常(在代码片段的第 7 行),我认为我清楚地限制了代码越界。如果有人发现缺陷,请指出。(注意数组是二维对象[36][25])。如果需要,我可以发布我对 dijkstra 算法的其余实现,但这是我认为错误所在。非常感谢所有帮助。

    public void setNeighbors(Node N)    //adds neighbors to openNode and closedNode lists. if added to openNode calculate parent
{
    if(N.getX() < 36)   //keeps from checking out of bounds (Note isTilePassable() works properly)
    {
        if(!isTilePassable(nodeGrid[N.getX()+1][N.getY()].getX() * 32, nodeGrid[N.getX()+1][N.getY()].getY() * 32)) //east
            closedNode.add(nodeGrid[N.getX()+1][N.getY()]);
    }

    if(N.getY() < 25)
    {
        if(!isTilePassable(nodeGrid[N.getX()][N.getY()+1].getX() * 32, nodeGrid[N.getX()][N.getY()+1].getY() * 32)) //south
            closedNode.add(nodeGrid[N.getX()][N.getY()+1]);
    }

    if(N.getX() > 0)
    {
        if(!isTilePassable(nodeGrid[N.getX()-1][N.getY()].getX() * 32, nodeGrid[N.getX()-1][N.getY()].getY() * 32)) //west
            closedNode.add(nodeGrid[N.getX()-1][N.getY()]);
    }

    if(N.getY() > 0)
    {
        if(!isTilePassable(nodeGrid[N.getX()][N.getY()-1].getX() * 32, nodeGrid[N.getX()][N.getY()-1].getY() * 32)) //north
            closedNode.add(nodeGrid[N.getX()][N.getY()-1]);
    }

    boolean add;

    if(N.getX() < 36)
    {
        add = true;
        for(Node e : closedNode)
        {
            if(e.equals(nodeGrid[N.getX()+1][N.getY()]))
                add = false;
        }
        for(Node e : openNode)
        {
            if(e.equals(nodeGrid[N.getX()+1][N.getY()]))
                add = false;
        }
        if(add)
        {
            openNode.add(nodeGrid[N.getX()+1][N.getY()]);
            openNode.get(openNode.size() - 1).setParent(N);
        }
    }

    if(N.getY() < 25)
    {
        add = true;
        for(Node e : closedNode)
        {
            if(e.equals(nodeGrid[N.getX()][N.getY()+1]))
                add = false;
        }
        for(Node e : openNode)
        {
            if(e.equals(nodeGrid[N.getX()][N.getY()+1]))
                add = false;
        }
        if(add)
        {
            openNode.add(nodeGrid[N.getX()][N.getY()+1]);
            openNode.get(openNode.size() - 1).setParent(N);
        }
    }

    if(N.getX() > 0)
    {
        add = true;
        for(Node e : closedNode)
        {
            if(e.equals(nodeGrid[N.getX()-1][N.getY()]))
                add = false;    
        }
        for(Node e : openNode)
        {
            if(e.equals(nodeGrid[N.getX()-1][N.getY()]))
                add = false;    
        }
        if(add)
        {
            openNode.add(nodeGrid[N.getX()-1][N.getY()]);
            openNode.get(openNode.size() - 1).setParent(N);
        }
    }

    if(N.getY() > 0)
    {
        add = true;
        for(Node e : closedNode)
        {
            if(e.equals(nodeGrid[N.getX()][N.getY()-1]))
                add = false;
        }
        for(Node e : openNode)
        {
            if(e.equals(nodeGrid[N.getX()][N.getY()-1]))
                add = false;
        }
        if(add)
        {
            openNode.add(nodeGrid[N.getX()][N.getY()-1]);
            openNode.get(openNode.size() - 1).setParent(N);
        }
    }
4

1 回答 1

0

这并不奇怪——java 中的数组从 0 开始——因此大小为 36 的数组将从索引 0 变为索引 35。尝试获取索引 36 将获取对象的第 37 个项目,该项目不存在。

if(N.getX() < 36)

在上面的行中,x 可能是 35(最大索引) - 然后它将尝试获取N.getX()+1超出范围的 =36。稍后的 Y 也是如此。

于 2013-11-05T04:20:04.973 回答