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
相关产品推荐
相关产品推荐

