gpt4 book ai didi

Java索引越界异常与dijkstra算法

转载 作者:行者123 更新时间:2023-12-01 04:12:36 24 4
gpt4 key购买 nike

我不断收到此索引越界异常(在代码片段中的第 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);
}
}

最佳答案

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

if(N.getX() < 36)

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

关于Java索引越界异常与dijkstra算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19781851/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com