目前我正在开发一个创造生命游戏的项目,但是我正在努力编写我必须使用的第一种方法之一。基本上,它必须读入文本文件并将其填入二维数组。现在我在main中遇到一个错误,上面写着“线程中的异常”主“java.util.NoSuchElementException:找不到行”。任何帮助将不胜感激。顺便说一句,我应该提一下,在文件中我知道行数,但想让它像我不知道行数/列数。
import java.util.*;
import java.io.*;
public class Proj5testing {
public static void main (String[] args)throws IOException{
Scanner inFile = new Scanner(new File("life4.txt"));
System.out.print(readBoard("life4.txt"));
}
public static int[][] readBoard(String filename)throws IOException{
int rows=0;
Scanner inFile = new Scanner(new File(filename));
while (inFile.hasNextLine()) {
rows++;
inFile.nextLine();
}
int cols=Integer.parseInt(inFile.nextLine());
int[][] grid=new int[rows][cols];
for(int i=0;i<grid.length;i++){
for(int k=0;k<grid[rows].length;k++){
grid[i][k]=inFile.nextInt();
}
}
return grid
}
}
答案 0 :(得分:1)
看看这段代码:
while (inFile.hasNextLine()) {
rows++;
inFile.nextLine();
}
这将循环直到没有更多行。当循环退出时,hasNextLine()
将为假(否则循环不会退出)。
然后立即致电:
int cols=Integer.parseInt(inFile.nextLine());
但我们已经确定文件中没有下一行!所以当然会引发错误。
相反,您需要处理循环中的每一行。我不知道你的文件的确切结构,但它会是这样的:
int[][] grid=new int[rows][cols];
int col = 0;
int row = 0;
while (inFile.hasNextInt()) {
grid[col][row] = inFile.nextInt();
col = col + 1;
if (col == cols) { //wrap to the next row
row = row + 1;
col = 0;
}
}
答案 1 :(得分:1)
问题是您正在尝试阅读inFile
中的下一行,但由于您已经读取了while循环中的所有行,因此没有下一行。
您必须重新声明Scanner
对象才能再次从头开始阅读。
答案 2 :(得分:0)
当while循环结束时,扫描程序已到达文件末尾。因此,没有更多的行(或整数)可供阅读。要解决此问题,您可以在for循环之前重新初始化扫描程序。
inFile = new Scanner(new File(filename));
您的代码还存在其他一些问题。看看下面修改过的代码(这可能会做你想要的):
import java.util.*;
import java.io.*;
public class Proj5testing {
public static void main (String[] args) throws IOException {
// System.out.print(readBoard("life4.txt"));
// this will just print a referenceId; if you want to print the contents, you need to write a loop to iterate over all the elements
int[][] board = readBoard("life4.txt");
for(int i = 0; i < board.length; i++) {
for(int j = 0; j < board[i].length; j++) {
System.out.print(board[i][j]);
}
System.out.println();
}
}
public static int[][] readBoard(String filename) throws IOException {
int rows = 0;
String line = "";
Scanner inFile = new Scanner(new File(filename));
while(inFile.hasNextLine()) {
rows++;
line = inFile.nextLine();
}
// int cols = line.split("\\s+").length;
// assuming that the file has space-separated integers in different lines
// e.g.
// 0 0 1 0 1
// 0 0 0 0 1
// 1 1 1 1 1
// since the file doesn't have space-separated integers, updating the answer
int cols = line.length();
// assuming that the file has lines in the following format
// 001001001
// 110011011
inFile = new Scanner(new File(filename));
// this will bring the scanner back to the start of the file
int[][] grid = new int[rows][cols];
for(int i = 0; i < rows; i++){
line = inFile.nextLine();
for(int k = 0; k < cols; k++){
grid[i][k] = line.charAt(k) - '0';
}
}
return grid;
}
}