Java编译错误:Exception in thread "main" java.util.NoSuchElementException含义及求助
问题原因
你遇到的NoSuchElementException是因为文件格式和读取逻辑不匹配:
- 你的
Blinker.txt中,除第一行的5 5用空格分隔外,后续每行是连续的数字字符(如00000、01110)。 - 代码里使用
scan2.nextInt()读取每个单元格的值,但Scanner的nextInt()会将连续的数字视为一个完整整数(比如把00000当成单个整数0,01110当成单个整数1110),导致实际能读取的整数数量远少于fileRow * fileColumn(仅5个,而非25个),当循环尝试读取更多整数时,就会抛出异常。
解决方案
不需要修改文件,直接调整读取逻辑,改为读取每行字符串后逐个解析字符:
修改后的readGrid方法代码:
public static int[][] readGrid(String fileName) throws IOException{ File file = new File(fileName); Scanner scan2 = new Scanner(file); // 读取行列数 fileRow = scan2.nextInt(); fileColumn = scan2.nextInt(); // 跳过行列数所在行的剩余换行符,避免后续nextLine读到空串 scan2.nextLine(); array = new int[fileRow][fileColumn]; for(int i = 0; i < fileRow; i++){ // 读取整行并去除首尾空白(防止行尾有多余空格) String line = scan2.nextLine().trim(); // 可选:检查行长度是否符合列数,避免格式错误 if(line.length() != fileColumn){ throw new IOException("第" + (i+1) + "行格式错误,长度应为" + fileColumn); } for(int j = 0; j < fileColumn; j++){ // 将字符转换为对应整数('0'的ASCII码减去自身得到0,以此类推) array[i][j] = line.charAt(j) - '0'; } } scan2.close(); // 关闭Scanner释放资源 return array; }
补充说明
你之前尝试的hasNextInt()无效,是因为hasNextInt()只会判断下一个输入是否为整数,而文件中后续的00000等字符串确实会被识别为整数,所以它会返回true,但每次读取都会消耗整行的连续数字,无法满足循环需要的25个整数,最终还是会抛出异常。
内容的提问来源于stack exchange,提问作者Boncappuccino
相关产品推荐
相关产品推荐

