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

Java读取50万行文件存入数组报NoSuchElementException求助

问题分析与解决方案

不是电脑性能问题,是代码逻辑错误导致的异常

问题根源

你的代码存在两个关键逻辑问题:

  1. 统计行数与读取方式不匹配:第一个Scanner用hasNextLine()判断是否存在下一行,但却调用s1.next()读取内容。hasNextLine()是检查是否有以换行符分隔的行,而next()是按默认空白符(空格、换行、制表符等)读取“令牌”。如果文件中存在空行,或者最后一行没有换行符,会导致统计的wordCounter和实际可读取的单词数不一致,第二个循环读取时就会因没有更多元素抛出NoSuchElementException。
  2. 两次扫描文件效率低下:50万行的文件两次IO操作会浪费资源,且增加出错概率。

修复方案

方案1:修复原有逻辑(最小改动)

将第一个Scanner中的s1.next()改为s1.nextLine(),保证统计的行数和实际读取的单词数一致(因为你的文件每行一个单词):

public static String[] readArray(String file) {
    int wordCounter = 0;
    try {
        Scanner s1 = new Scanner(new File(file));
        while (s1.hasNextLine()) {
            wordCounter++;
            s1.nextLine(); // 改为读取整行,匹配hasNextLine()的判断逻辑
        }
        s1.close();
        
        String[] words = new String[wordCounter];
        Scanner s2 = new Scanner(new File(file));
        for (int i = 0; i < wordCounter; i++) {
            words[i] = s2.nextLine(); // 同样改为读取整行
        }
        s2.close();
        return words;
    } catch (FileNotFoundException e) {
        e.printStackTrace(); // 不要空catch,至少打印异常信息
    }
    return null;
}

方案2:更高效的单扫描实现(推荐)

用List<String>存储内容,只需一次读取文件,避免计数错误和重复IO:

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public static String[] readArray(String file) {
    List<String> wordList = new ArrayList<>();
    try (Scanner scanner = new Scanner(new File(file))) { // 用try-with-resources自动关闭资源
        while (scanner.hasNextLine()) {
            String line = scanner.nextLine().trim(); // 可选:去除首尾空白,避免空行干扰
            if (!line.isEmpty()) { // 可选:跳过空行
                wordList.add(line);
            }
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    return wordList.toArray(new String[0]);
}

额外提示

  • 永远不要留空的catch块,至少打印异常信息,否则出现问题无法排查。
  • 对于大文件,使用try-with-resources语法可以自动关闭资源,避免资源泄漏。
  • 如果你的“单词”可能包含空格,那nextLine()才是正确的读取方式,而next()会把空格分隔的内容拆成多个元素,这也会导致计数错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 00:47:15