1

このインデックスが範囲外の例外を取得し続けます (コード スニペットの 7 行目)。ここで、コードが範囲外に達するのを明確に制限すると考えました。誰かが欠陥を見つけたら、それを指摘してください。(配列は 2 次元 Object[36][25] であることに注意してください)。必要に応じて、ダイクストラのアルゴリズムの残りの実装を投稿できますが、これはエラーがあると思われる場所です。すべてのヘルプは大歓迎です。

    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)

N.getX()+1上記の行では、x は 35 (最大インデックス) である可能性があり、範囲外である =36 を取得しようとします。Y についても同様です。

于 2013-11-05T04:20:04.973 に答える