读取文本文件时触发java.util.NoSuchElementException异常求助
解决java.util.NoSuchElementException: No line found异常
问题原因
你的代码抛出异常的核心原因有两点:
- 自定义分隔符
\|未包含换行符,导致第三个next()会读取字段内容+换行符,且后续调用nextLine()时,在处理完最后一行后,没有剩余行可读取,触发NoSuchElementException。 - 最后一行读取完三个字段后,Scanner指针已到文件末尾,
itemReader.nextLine()无行可读,直接抛出异常。
解决方案
方法一:按行读取+拆分字段(推荐,更健壮)
先逐行读取文件内容,再将每行按|拆分,这种方式能更好地处理格式异常和空行:
File itemFile = new File("src/items.txt"); // 使用try-with-resources自动关闭Scanner,避免资源泄漏 try (Scanner itemReader = new Scanner(itemFile)) { while (itemReader.hasNextLine()) { String line = itemReader.nextLine(); // 跳过空行 if (line.trim().isEmpty()) { continue; } // 按|拆分每行内容 String[] parts = line.split("\\|"); // 确保每行有3个字段,避免格式错误 if (parts.length == 3) { String itemName = parts[0].trim(); String itemDesc = parts[1].trim(); String itemLocation = parts[2].trim(); Item item = new Item(itemName, itemDesc, itemLocation); Item.addItem(item); } else { System.out.println("无效的行格式:" + line); } } } catch (FileNotFoundException e) { System.out.println("未找到Items.txt文件"); }
方法二:调整Scanner分隔符,移除nextLine()
修改分隔符,同时匹配|和换行符,让Scanner自动处理换行,无需手动调用nextLine():
File itemFile = new File("src/items.txt"); Scanner itemReader = null; try { itemReader = new Scanner(itemFile); // 分隔符匹配|或换行(\r?\n兼容Windows/Linux换行) itemReader.useDelimiter("\\||\\r?\\n"); while (itemReader.hasNext()) { String itemName = itemReader.next().trim(); // 提前检查是否有下一个字段,避免字段缺失导致异常 if (!itemReader.hasNext()) break; String itemDesc = itemReader.next().trim(); if (!itemReader.hasNext()) break; String itemLocation = itemReader.next().trim(); Item item = new Item(itemName, itemDesc, itemLocation); Item.addItem(item); } } catch (FileNotFoundException e) { System.out.println("未找到Items.txt文件"); } finally { if (itemReader != null) { itemReader.close(); } }
额外建议
- 优先使用try-with-resources语法,它会自动关闭实现了
AutoCloseable接口的资源(比如Scanner),避免手动关闭时可能出现的资源泄漏。 - 处理文件时,增加格式校验(比如检查字段数量),能有效避免因文件内容异常导致的程序崩溃。
内容的提问来源于stack exchange,提问作者EXT_Rue
相关产品推荐
相关产品推荐

