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

使用Java Scanner类读取文件下一行时遇到问题

问题分析与修复方案

嘿,我来帮你捋捋这个问题——你遇到的nextLine()读取全部剩余内容,还有抛出NoSuchElementException的情况,本质都是Scanner的使用逻辑没处理好,咱们一步步拆解:

核心问题拆解

看你的代码,有两个关键漏洞:

  1. 未检查是否还有下一行就调用nextLine():当文件已经读到末尾时,再调用这个方法必然会抛出NoSuchElementException,比如你的body数组长度比文件实际的有效行数多的时候,循环还没跑完就没内容可读了。
  2. 循环前提前读取一行的逻辑有问题:你在循环开始前先读了一行,然后循环里每次赋值后再读下一行,这很容易导致行数不匹配,比如文件刚好够body.length行的话,最后一次循环里的nextLine()就会触发异常。

另外,你说nextLine()会读取全部剩余内容,大概率是因为文件里的换行符不规范(比如某些行没有正确的换行标记),或者Scanner的指针位置不对,但核心还是没做存在性检查就直接读。

修复后的代码示例

把逻辑调整成先检查再读取,同时修正循环的写法:

header = getHeaderLine(fname, columns); 
Scanner inputFile = null; 
try{ 
    inputFile = new Scanner(new FileInputStream(fname)); 
} catch (FileNotFoundException e){ 
    System.out.println("File is not found."); 
    System.exit(0); 
} 

// 跳过表头前先确认还有行可读,避免空文件时出错
if (hasHeader && inputFile.hasNextLine()) { 
    inputFile.nextLine(); 
} 

int i = 0;
// 双重判断:还有行可读,并且body数组还没填满
while (inputFile.hasNextLine() && i < body.length) { 
    String line = inputFile.nextLine(); 
    body[i] = getEntries(line, columns); 
    i++; 
}

// 可选:加个提示,避免文件行数不够时一脸懵
if (i < body.length) {
    System.out.println("提示:文件行数不足,只填充了" + i + "条数据");
}

额外小提醒

  • 用Scanner读内容的时候,一定要先调用hasNextLine()确认还有内容,再调用nextLine(),这是避免这类异常的黄金准则。
  • 如果还是出现读取全部剩余内容的情况,检查下你的文件换行符是不是标准的(Windows是\r\n,Unix/Linux是\n),有些编辑器保存的文件可能换行符有问题,导致Scanner识别不了换行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:06:51