Java中将文本文件存入二维字符数组时遇“无行”错误的求助
解决文件读取时的"No line found"异常问题
看起来你遇到的问题核心不是用户输入的Scanner,而是文件读取的逻辑错误导致提前耗尽了文件内容,抛出NoSuchElementException。咱们一步步拆解问题并修复:
1. 核心问题分析
你的代码存在几个关键逻辑错误:
- 错误的行读取逻辑:在嵌套循环里重复调用
fileReader.nextLine(),假设你的5x6 ASCII图像是5行、每行6个字符,那文件总共只有5行,但你的代码会尝试读取5*6=30行,远远超出文件实际行数,自然会抛出"no line found"。 - offset变量误用:你试图用它逐个取字符,但每次读一行后只取一个字符还不断自增,后续会出现字符索引越界问题。
- 资源未正确关闭:原代码里
fileReader.close()写在return之后,根本不会执行,会导致资源泄漏。 - 未定义的行列变量:代码里的
row和col没有看到定义,编译时就会报错。
2. 修复后的完整代码示例
下面是修正后的代码,我标注了关键修改点:
import java.io.File; import java.io.FileNotFoundException; import java.util.Scanner; public class AsciiImageLoader { // 定义固定的行列数(符合你的5x6需求) private static final int IMAGE_ROWS = 5; private static final int IMAGE_COLS = 6; public static void main(String[] args) { System.out.println("Hello! I load files."); System.out.println("Please, enter file name:"); Scanner inputScanner = new Scanner(System.in); String fileName = inputScanner.nextLine(); try { char[][] loadedImage = loadAsciiImage(fileName); // 打印验证加载结果 for (char[] row : loadedImage) { System.out.println(row); } } catch (FileNotFoundException e) { System.out.println("错误:找不到目标文件 - " + e.getMessage()); } catch (IllegalArgumentException e) { System.out.println("错误:文件格式不符合要求 - " + e.getMessage()); } catch (Exception e) { System.out.println("读取出错:" + e.getMessage()); } inputScanner.close(); // 输入完成后再关闭Scanner即可 } public static char[][] loadAsciiImage(String fileName) throws FileNotFoundException { char[][] image = new char[IMAGE_ROWS][IMAGE_COLS]; // 使用try-with-resources自动关闭文件Scanner,无需手动处理 try (Scanner fileReader = new Scanner(new File(fileName))) { int currentRow = 0; // 只读取需要的5行内容 while (fileReader.hasNextLine() && currentRow < IMAGE_ROWS) { String line = fileReader.nextLine(); // 检查当前行字符数是否足够 if (line.length() >= IMAGE_COLS) { for (int col = 0; col < IMAGE_COLS; col++) { image[currentRow][col] = line.charAt(col); } } else { throw new IllegalArgumentException("第" + (currentRow + 1) + "行字符数不足6个"); } currentRow++; } // 检查是否读取到足够的行数 if (currentRow < IMAGE_ROWS) { throw new IllegalArgumentException("文件行数不足5行"); } return image; } } }
3. 关键修改说明
- 修正读取逻辑:逐行读取5行内容,每行提取前6个字符填充到二维数组的对应行,完全匹配你5x6图像的需求。
- 自动资源管理:用
try-with-resources语法自动关闭文件Scanner,避免资源泄漏,不用再手动写close()。 - 增加边界校验:检查每行的字符数、文件的总行数,提前抛出明确的错误提示,方便排查问题。
- 移除无效变量:删掉了逻辑错误的
offset变量,直接通过行列索引定位字符,逻辑更清晰。
4. 关于输入Scanner的说明
你怀疑的输入Scanner其实不是问题根源,即使不手动关闭,JVM在程序结束时也会自动回收资源。如果要关闭,放在输入完成后、程序收尾阶段即可,就像上面代码里那样。
内容的提问来源于stack exchange,提问作者Samkayoki
相关产品推荐
相关产品推荐

