Java读取文件触发java.util.NoSuchElementException异常如何修复?
问题:java.util.NoSuchElementException 异常排查与修复
我遇到了java.util.NoSuchElementException异常,无法确定其触发原因。通过调试确认文件已成功读取,但在处理最后一个索引时触发该异常。
相关代码如下:
try { txtin = new Scanner(gameFile); //String line; while(txtin.hasNext()) { for(int i = 0; i < 15; i++) { Grid[i] = txtin.next(); } } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { if (txtin != null) txtin.close(); }
触发的异常信息为:
Exception in thread "main" java.util.NoSuchElementException
请问该如何修复这个问题?
解决方案
这个问题我之前也碰到过,核心原因是你的循环逻辑没考虑到文件中元素总数不是15的倍数的情况,咱们一步步拆解:
为什么会抛出异常?
外层的while(txtin.hasNext())只会判断当前是否还有至少一个元素可以读取,但内层循环要求每次必须连续读取15个元素。举个例子:如果文件里一共有16个元素,第一次循环能顺利取完15个,剩下1个元素;此时外层hasNext()判断为true,会再次进入循环,内层循环从i=0开始取到最后1个元素,但当i=1时,再调用txtin.next()就没有元素可以读取了,直接抛出NoSuchElementException。
修复方案一:内层循环增加存在性检查
在内层循环每次读取前,先判断是否还有元素可用,避免强行读取不存在的元素:
try { txtin = new Scanner(gameFile); while(txtin.hasNext()) { for(int i = 0; i < 15; i++) { // 每次读取前先检查是否还有元素 if (!txtin.hasNext()) { // 可以选择退出内层循环,或者给Grid[i]设置默认值 break; } Grid[i] = txtin.next(); } } } catch (FileNotFoundException e) { e.printStackTrace(); } finally { if (txtin != null) txtin.close(); }
修复方案二:先读取所有元素再分组处理
这种方式更稳妥,先把文件里的所有元素一次性读取到集合中,再按15个一组进行处理,能彻底避免边界问题:
try { txtin = new Scanner(gameFile); List<String> allElements = new ArrayList<>(); // 先读取所有元素到集合 while(txtin.hasNext()) { allElements.add(txtin.next()); } // 按15个一组处理 for (int i = 0; i < allElements.size(); i += 15) { // 计算当前组的结束索引,避免越界 int endIndex = Math.min(i + 15, allElements.size()); for (int j = i; j < endIndex; j++) { // 给Grid赋值,j-i是当前组内的索引 Grid[j - i] = allElements.get(j); } // 这里可以添加每组Grid的业务处理逻辑,比如保存或使用 } } catch (FileNotFoundException e) { e.printStackTrace(); } finally { if (txtin != null) txtin.close(); }
额外建议
- 如果你的文件是按行存储数据的,建议改用
hasNextLine()和nextLine(),这样更符合按行读取的场景,避免因为元素分割符(默认是空格)的问题导致读取异常。 - 可以在异常捕获中增加对
NoSuchElementException的处理,方便调试时定位问题:
catch (NoSuchElementException e) { System.err.println("读取元素时遇到异常,可能是元素数量不足:" + e.getMessage()); e.printStackTrace(); }
内容的提问来源于stack exchange,提问作者GiftoDumbo
相关产品推荐
相关产品推荐

