如何纠正我的 Java 异常溢出:索引 3,共 3 个越界
How to rectify my Java exception overflow: index 3 of 3 out of bounds
我运行陷入溢出异常。这是家庭作业;我不是在寻找直接的答案,因为那不会帮助我学习。这个作业是给我的人工智能 class。我们正在使用最佳优先算法和 A* 算法解决 n 拼图问题。
我有一个代表我的游戏板的二维数组。总共有 8 个方块,其中 1 个空白 space。那些不熟悉 n-puzzle 的人。关键是通过移动空白瓷砖并移动其他 8 块来从瓷砖的起始配置到目标配置。到目前为止,在这个作业中,我正在实现空白块的移动,将空白块与上、左、右或最近的下图块交换。我也有显示板的功能。我也实现了所有定向运动。
我尝试声明一个临时二维数组并使用内置函数 Arrays.copyOf(board, board.length)
。编译时抱怨传递了一个二维数组。我只是不确定我的支票是如何越界的。此外,如果数组已更新,则 'b' 将在 (i= 0, j = 1) 处找到,将 1 添加到 j 会使我位于数组的边缘。这让我相信我需要在进行更多更改之前复制我的二维数组。如果数组实际上没有更新 'b' 会在我的边缘,然后我尝试将它移出边界。这对我来说很有意义,但它显示数组在我的输出中进行了更改。
我知道这是一个低级问题。我只是不知道如何在 Java 中复制数组,谢谢。我现在的参考是“思考 Java 第 4 版”。布鲁斯·埃克尔
下面你会发现我的主要代码执行流程,我实现的 moveBlankLeft/Right 函数,以及 运行 代码产生的溢出异常。
public static void main(String[] args)
{
bestFirst game = new bestFirst( );
game.displayBoard( );
game.moveBlankLeft(game.moves, game.defheight, game.defwidth);
game.displayBoard( );
game.moveBlankRight(game.moves, game.defwidth, game.defheight);
game.displayBoard( );
}
int moveBlankLeft(int moves, int defwidth, int defheight)
{
moves = moves + 1;
for(int i = 0; i < defheight; i++)
{
for(int j = 0; j < defwidth; j++)
{
if((i < defheight && j < defwidth && i >= 0 && j >=
0)&&board[i][j]=='b')
{
char temp = board[i][j - 1];
board[i][j] = temp;
board[i][j - 1] = 'b';
}
}
}
System.out.println(" Total moves in solving: " +moves);
return 0;
}
int moveBlankRight(int moves, int defwidth, int defheight)
{
moves = moves + 1;
for(int i = 0; i < defheight; i++)
{
for(int j = 0; j < defwidth; j++)
{
if((i < defheight && j < defwidth && i >= 0 && j >=
0)&&board[i][j]=='b')
{
char temp = board[i][j + 1]; <-- culprit line...
board[i][j] = temp;
board[i][j + 1] = 'b';
}
}
}
System.out.println(" Total moves in solving: " +moves);
return 0;
}
Welcome to the best-first n-puzzle challenge solver.
4 5 b
6 1 8 = initial board
7 3 2
Total moves in solving: 1
4 b 5
6 1 8 = board after shiftBlankLeft(...)
7 3 2
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
at bestFirst.moveBlankRight(best-first.java:83)
at bestFirst.main(best-first.java:161)
在 moveBlankRight
方法中,您应该将您的实现替换为:
if(j== defwidth-1){
char temp= bord[i+1][0];
board[i+1][0]='b';
board[i][j]=temp;
}
else{
char temp = board[i][j + 1];
board[i][j] = temp;
board[i][j + 1] = 'b';
}
这样输出将是:
Welcome to the best-first n-puzzle challenge solver.
4 5 b
6 1 8 = initial board
7 3 2
// move right of b
4 5 6
b 1 8 = board after shiftBlankRight
7 3 2
你还应该加上条件 if(i==defheight-1)
我运行陷入溢出异常。这是家庭作业;我不是在寻找直接的答案,因为那不会帮助我学习。这个作业是给我的人工智能 class。我们正在使用最佳优先算法和 A* 算法解决 n 拼图问题。
我有一个代表我的游戏板的二维数组。总共有 8 个方块,其中 1 个空白 space。那些不熟悉 n-puzzle 的人。关键是通过移动空白瓷砖并移动其他 8 块来从瓷砖的起始配置到目标配置。到目前为止,在这个作业中,我正在实现空白块的移动,将空白块与上、左、右或最近的下图块交换。我也有显示板的功能。我也实现了所有定向运动。
我尝试声明一个临时二维数组并使用内置函数 Arrays.copyOf(board, board.length)
。编译时抱怨传递了一个二维数组。我只是不确定我的支票是如何越界的。此外,如果数组已更新,则 'b' 将在 (i= 0, j = 1) 处找到,将 1 添加到 j 会使我位于数组的边缘。这让我相信我需要在进行更多更改之前复制我的二维数组。如果数组实际上没有更新 'b' 会在我的边缘,然后我尝试将它移出边界。这对我来说很有意义,但它显示数组在我的输出中进行了更改。
我知道这是一个低级问题。我只是不知道如何在 Java 中复制数组,谢谢。我现在的参考是“思考 Java 第 4 版”。布鲁斯·埃克尔
下面你会发现我的主要代码执行流程,我实现的 moveBlankLeft/Right 函数,以及 运行 代码产生的溢出异常。
public static void main(String[] args)
{
bestFirst game = new bestFirst( );
game.displayBoard( );
game.moveBlankLeft(game.moves, game.defheight, game.defwidth);
game.displayBoard( );
game.moveBlankRight(game.moves, game.defwidth, game.defheight);
game.displayBoard( );
}
int moveBlankLeft(int moves, int defwidth, int defheight)
{
moves = moves + 1;
for(int i = 0; i < defheight; i++)
{
for(int j = 0; j < defwidth; j++)
{
if((i < defheight && j < defwidth && i >= 0 && j >=
0)&&board[i][j]=='b')
{
char temp = board[i][j - 1];
board[i][j] = temp;
board[i][j - 1] = 'b';
}
}
}
System.out.println(" Total moves in solving: " +moves);
return 0;
}
int moveBlankRight(int moves, int defwidth, int defheight)
{
moves = moves + 1;
for(int i = 0; i < defheight; i++)
{
for(int j = 0; j < defwidth; j++)
{
if((i < defheight && j < defwidth && i >= 0 && j >=
0)&&board[i][j]=='b')
{
char temp = board[i][j + 1]; <-- culprit line...
board[i][j] = temp;
board[i][j + 1] = 'b';
}
}
}
System.out.println(" Total moves in solving: " +moves);
return 0;
}
Welcome to the best-first n-puzzle challenge solver.
4 5 b
6 1 8 = initial board
7 3 2
Total moves in solving: 1
4 b 5
6 1 8 = board after shiftBlankLeft(...)
7 3 2
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
at bestFirst.moveBlankRight(best-first.java:83)
at bestFirst.main(best-first.java:161)
在 moveBlankRight
方法中,您应该将您的实现替换为:
if(j== defwidth-1){
char temp= bord[i+1][0];
board[i+1][0]='b';
board[i][j]=temp;
}
else{
char temp = board[i][j + 1];
board[i][j] = temp;
board[i][j + 1] = 'b';
}
这样输出将是:
Welcome to the best-first n-puzzle challenge solver.
4 5 b
6 1 8 = initial board
7 3 2
// move right of b
4 5 6
b 1 8 = board after shiftBlankRight
7 3 2
你还应该加上条件 if(i==defheight-1)