我正在研究一个项目,必须使用charAt连续将文本文件中数组的元素添加到我要指定的新数组中。数组的大小取决于所使用的文本文件,因此最好假定该文件的内容未知,但是我将提供一个示例。
我在运行代码时仍然不断收到“ StringIndexOutOfBoundException”,但我不确定原因或解决方法。
代码应该做的是用用户输入来获取确切的文本文件位置,然后它将逐行读取并将其添加到新数组中。文本文件数组的前两行是数组的行和列的大小。
我的代码如下:
public static void main(String[] args) throws FileNotFoundException
{
System.out.println("Enter the location of the board file using the FULL PATH NAME.");
Scanner input = new Scanner(System.in);
String n = input.nextLine();
input.close();
File a = new File(n);
Scanner sc = new Scanner(a);
int row = sc.nextInt();
int col = sc.nextInt();
char[][] board = new char[row][col];
for (int numRow = 0; numRow < row+1; numRow ++)
{
String string = sc.next();
for (int numCol = 0; numCol < col+1; numCol++)
{
board[row][col] = string.charAt(numCol);
}
}
sc.close();
GridGame game = new GridGame (row, col, board);
game.playGame();
示例输入文本文件:
10 10
EEEEEEEEEEES
SWWWWWWWWW
EEEEEEEEEEES
SWWWWWWWWW
EEEEEEEEEEES
SWWWWWWWWW
EEEEEEEEEEES
SWWWWWWWWW
EEEEEEEEEEES
TWWWWWWWWW
您面临的问题是因为Java array
具有从0开始的索引,即第一个元素的索引为0
,最后一个元素的索引为array.length - 1
。因此,以变量作为array
索引的循环不应超过array.length - 1
。您的终止条件numRow < row+1
将numRow
的值取为array
的长度,而不是array.length - 1
的长度。
替换
for (int numRow = 0; numRow < row+1; numRow ++)
{
String string = sc.next();
for (int numCol = 0; numCol < col+1; numCol++)
{
board[row][col] = string.charAt(numCol);
}
}
with
for (int r = 0; r < row && sc.hasNextLine(); r++) {
board[r] = sc.nextLine().toCharArray();
}
[您需要了解的另一个概念是Java中的2-D数组,即数组的数组,即board[0]
应该保存文件第一行中的字符数组,board[1]
应该保存文件中第一行的字符数组。文件的第二行,依此类推。现在,如果要访问文件中第三行的第四个字符,则可以将其作为board[2][3]
进行访问。
最后但并非最不重要的一点是关于关闭Scanner
的System.in
。您永远不要关闭此Scanner
,因为它也会关闭System.in
。因此,您应该从代码中删除行input.close()
。
如有任何疑问/问题,请随时发表评论。
您也可以将上述单个循环编写为嵌套循环,但这不是必需的。
for (int r = 0; r < row && sc.hasNextLine(); r++) {
char[] lineChars = sc.nextLine().toCharArray();
for(int c = 0; c < col; c++) {
board[r][c] = lineChars [c];
}
}
您需要嵌套循环才能访问/处理单个字符,但是要存储/访问/处理二维数组的每一行,则不需要嵌套循环。正如我已经提到的,二维数组是一维数组的数组,因此要访问这些一维数组(不是这些一维数组中的单个元素),您需要一个循环,而不是一个嵌套循环。