使用Scanner读取分号分隔CSV跳过首数字时出现NoSuchElementException如何解决
问题原因
你的代码存在三处核心错误,共同触发了NoSuchElementException异常:
- 外层Scanner默认使用空白字符作为分隔符,调用
next()无法读取完整行,传入解析方法的内容本身不符合预期 - 解析方法中配置的分隔符为逗号,与你实际使用的分号分隔格式完全不匹配
- 没有做行首第一个数字字段的跳过逻辑,字段读取顺序和数量都不符合你给出的CSV格式
修复代码
public static void main(String[] args) throws IOException { Path path = Paths.get("src/main/resources/city.csv"); Scanner scanner = new Scanner(path); // 按行读取完整内容 while (scanner.hasNextLine()) { City city = parseInfo(scanner.nextLine()); System.out.println(city); } scanner.close(); } private static City parseInfo(String line) { Scanner scanner = new Scanner(line); // 改为分号作为分隔符,兼容分号前后可能的空格 scanner.useDelimiter("\\s*;\\s*"); // 跳过行首第一个序号字段 scanner.next(); String name = scanner.next(); String region = scanner.next(); String district = scanner.next(); int population = scanner.nextInt(); int foundation = scanner.nextInt(); scanner.close(); return new City(name, region, district, population, foundation); }
额外优化建议
如果要进一步提升鲁棒性,可以在读取每个字段前先调用hasNext()/hasNextInt()做校验,避免异常行导致整个程序崩溃。
内容的提问来源于stack exchange,提问作者dankatle
相关产品推荐
相关产品推荐

