使用Java Scanner读取无尾逗号多行文件时出现NoSuchElementException的解决方法
解决Java Scanner读取无行尾逗号的CSV文件时抛出NoSuchElementException的问题
我来帮你搞定这个头疼的Scanner问题!你遇到的异常本质是因为Scanner的分隔符设置只识别了逗号,而每行最后一个字段后面没有逗号,导致Scanner在读取到行尾时,无法识别到下一个分隔符,当你继续调用next()方法时就会抛出NoSuchElementException。下面给你两种靠谱的解决方案:
方案一:逐行读取后拆分(推荐)
这种方法最稳妥,先把每行完整读出来,再按逗号拆分字段,完全不受行尾有没有逗号的影响,还能避免跨行读取字段的问题:
import java.io.File; import java.io.FileNotFoundException; import java.util.Scanner; public class FileReader { public static void main(String[] args) { // 使用try-with-resources自动关闭Scanner,避免资源泄漏 try (Scanner scanner = new Scanner(new File("your-file-path.txt"))) { // 循环读取每一行 while (scanner.hasNextLine()) { String line = scanner.nextLine(); // 按逗号拆分每行的字段 String[] fields = line.split(","); // 处理每个字段,这里示例是打印,你可以换成自己的业务逻辑 for (String field : fields) { // 如果字段前后有空格,用trim()去除 System.out.println("字段内容:" + field.trim()); } } } catch (FileNotFoundException e) { System.err.println("找不到文件:" + e.getMessage()); e.printStackTrace(); } } }
方案二:修改Scanner的分隔符
如果你一定要用Scanner的next()方法逐个读取字段,可以把分隔符设置为逗号或者换行符,这样Scanner会把逗号和换行都当作字段分隔符,即使行尾没有逗号,换行也会被识别为分隔符,不会出现无元素可读取的情况:
import java.io.File; import java.io.FileNotFoundException; import java.util.Scanner; public class FileReader { public static void main(String[] args) { try (Scanner scanner = new Scanner(new File("your-file-path.txt"))) { // 设置分隔符:逗号(,) 或者 换行符(\n),注意正则表达式要转义 scanner.useDelimiter(",|\\n"); // 循环读取每个字段 while (scanner.hasNext()) { String field = scanner.next().trim(); System.out.println("字段内容:" + field); } } catch (FileNotFoundException e) { System.err.println("找不到文件:" + e.getMessage()); e.printStackTrace(); } } }
为什么原来的方法会报错?
举个例子,如果你之前设置了scanner.useDelimiter(","),当你读完该行最后一个字段后,下一次调用scanner.next()时,Scanner会尝试继续读取,但此时行尾的换行符并不是设置的分隔符,若已经到文件末尾,或者你按固定次数调用next()(比如每行3个字段就调用3次),就会因为没有更多元素而抛出NoSuchElementException。而逐行读取的方法能确保你每次处理的是完整的一行字段,从根源上避免了这个问题。
内容的提问来源于stack exchange,提问作者dhiv
相关产品推荐
相关产品推荐

