Java读取50万行文件存入数组报NoSuchElementException求助
问题分析与解决方案
不是电脑性能问题,是代码逻辑错误导致的异常
问题根源
你的代码存在两个关键逻辑问题:
- 统计行数与读取方式不匹配:第一个
Scanner用hasNextLine()判断是否存在下一行,但却调用s1.next()读取内容。hasNextLine()是检查是否有以换行符分隔的行,而next()是按默认空白符(空格、换行、制表符等)读取“令牌”。如果文件中存在空行,或者最后一行没有换行符,会导致统计的wordCounter和实际可读取的单词数不一致,第二个循环读取时就会因没有更多元素抛出NoSuchElementException。 - 两次扫描文件效率低下: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
相关产品推荐
相关产品推荐

