You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java读取文件报错求助:空行导致程序崩溃

解决Scanner读取含空行文件崩溃的问题

嘿,我懂你遇上的麻烦了!你的代码在碰到空行或者元素不足的行时直接崩溃,核心原因是你直接调用inFile.next()时,Scanner找不到下一个输入元素,就会抛出NoSuchElementException。咱们来一步步搞定这个问题:

问题根源

你的代码逻辑是每次循环直接取两个元素,但文件里的空行没有任何元素,或者某一行的元素数量不足2个时,next()方法就会因为找不到下一个输入项而抛出异常,直接导致程序崩溃。

解决方案:先读整行再处理(推荐)

更稳妥的方式是先读取整行内容,跳过空行后再拆分每行的元素,这样能精准控制每行的处理逻辑,彻底避免异常。修改后的代码如下:

import java.io.FileReader;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class FileReaderExample {
    public static void main(String[] args) {
        try {
            Scanner inFile = new Scanner(new FileReader("input.txt"));
            while (inFile.hasNextLine()) {
                // 先读取整行并去除首尾空白
                String line = inFile.nextLine().trim();
                // 跳过空行或者仅含空白字符的行
                if (line.isEmpty()) {
                    continue;
                }
                // 用Scanner拆分当前行的元素
                Scanner lineScanner = new Scanner(line);
                // 确保有元素再读取
                if (lineScanner.hasNext()) {
                    String first = lineScanner.next();
                    System.out.println("first: " + first);
                    // 检查是否存在第二个元素
                    if (lineScanner.hasNext()) {
                        String second = lineScanner.next();
                        System.out.println("second: " + second);
                    } else {
                        System.out.println("该行仅包含一个元素: " + first);
                    }
                }
                lineScanner.close();
            }
            inFile.close();
        } catch (FileNotFoundException exception) {
            System.out.println("Unable to locate file");
        }
    }
}

另一种方案:读取前先检查元素是否存在

如果你不想大幅改动原有循环逻辑,也可以在每次调用next()之前先检查hasNext(),这种方式能避免NoSuchElementException,但需要额外处理行内元素不足的情况,示例代码如下:

try {
    Scanner inFile = new Scanner(new FileReader("input.txt"));
    while (inFile.hasNextLine()) {
        // 先检查是否有第一个元素
        if (inFile.hasNext()) {
            String first = inFile.next();
            System.out.println("first: " + first);
            // 检查是否有第二个元素
            if (inFile.hasNext()) {
                String second = inFile.next();
                System.out.println("second: " + second);
            } else {
                System.out.println("缺少第二个元素,当前第一个元素: " + first);
            }
        }
        // 读完当前行剩余内容,避免空行导致循环异常
        inFile.nextLine();
    }
    inFile.close();
} catch (FileNotFoundException exception) {
    System.out.println("Unable to locate file");
}

为什么更推荐第一种方案?

第一种方案把每行的处理独立开来,不仅能跳过空行,还能灵活应对每行元素数量不一致的情况——比如你的文件里Bob Jill 43这一行有三个元素,第一种方案可以根据需求选择如何处理多出来的元素,而第二种方案可能会把43错当成下一行的第一个元素,逻辑容易混乱。

内容的提问来源于stack exchange,提问作者Bradie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:24:03