如何使用Scanner跳过换行符?读取文本文件抛NoSuchElementException求解
Scanner读取换行分隔字符的异常与空元素问题
问题根源分析
你的代码存在几个关键问题:
- Scanner对象未初始化,只声明了变量却没有通过
new Scanner(file)创建实例,这是基础错误。 scanner.skip("\n")直接调用会触发NoSuchElementException:当文件开头没有换行,或者循环到末尾没有剩余换行时,skip找不到匹配字符就会抛异常。useDelimiter("")放在循环内部完全冗余,应该在创建Scanner后一次性设置,让它逐个读取字符。
修正方案(推荐)
直接读取所有字符,过滤掉换行/回车符,既安全又简洁:
File file = new File("src/crossword/squares/" + Crossword + ".txt"); ArrayList<String> values = new ArrayList<>(); try (Scanner scanner = new Scanner(file)) { // 自动关闭资源,避免内存泄漏 scanner.useDelimiter(""); // 设置空分隔符,逐个读取每个字符 while (scanner.hasNext()) { String value = scanner.next(); // 过滤掉换行符(\n)和回车符(\r,兼容Windows换行格式) if (!"\n".equals(value) && !"\r".equals(value)) { values.add(value); } } } catch (FileNotFoundException e) { e.printStackTrace(); }
另一种方案(基于skip的改进)
如果一定要用skip,可以用正则匹配任意数量的换行/回车,避免找不到匹配的异常:
File file = new File("src/crossword/squares/" + Crossword + ".txt"); ArrayList<String> values = new ArrayList<>(); try (Scanner scanner = new Scanner(file)) { scanner.useDelimiter(""); // 先处理第一个字符,避免开头无换行的情况 if (scanner.hasNext()) { String firstChar = scanner.next(); if (!"\n".equals(firstChar) && !"\r".equals(firstChar)) { values.add(firstChar); } } // 跳过任意数量的换行/回车,再读取有效字符 while (scanner.hasNext()) { scanner.skip("[\n\r]*"); // *允许0次匹配,不会抛异常 if (scanner.hasNext()) { values.add(scanner.next()); } } } catch (FileNotFoundException e) { e.printStackTrace(); }
内容的提问来源于stack exchange,提问作者user22737329
相关产品推荐
相关产品推荐

