Java按分隔符拆分纯单词存ArrayList,用Scanner读文件时列表为空
问题根源
- 分隔符规则配置完全失效
- 当前代码设置的分隔符正则
" \\$ |[\\r\\n]+"仅匹配两类内容:前后带空格的字面美元符号序列、连续的回车/换行符 - 普通文本中分隔单词的普通空格、各类标点符号均不被识别为分隔边界,无法完成单词拆分
- 若测试文件内容全部为分隔符可匹配的字符(如全是换行、无其他有效文本),Scanner会跳过所有分隔内容,判定无有效token,读取循环不执行,最终ArrayList为空
- 当前代码设置的分隔符正则
- 路径写法存在解析偏差风险
- 代码中的路径为无盘符的根相对路径
"\\Users\\marga\\Desktop\\objekt program\\oo2021\\w05_kontrolltoo1\\textHere.txt",Windows系统下会根据程序启动时的当前盘符解析路径,若盘符与文件实际所在盘符不一致,会出现文件访问失败的问题 - 其他方式能完成全文字符计数,不代表当前Scanner关联的File对象指向的是实际的目标文件
- 代码中的路径为无盘符的根相对路径
修正方案
- 替换适配单词拆分需求的分隔符规则:使用正则
[^a-zA-Z0-9]+作为分隔符,将所有连续的非字母、非数字内容(含空白、标点、特殊符号)作为拆分边界,自动过滤非文本内容 - 优化路径写法:使用带盘符的绝对路径,以正斜杠代替反斜杠,无需额外转义,兼容跨环境路径解析
- 增加空指针防护:在资源关闭环节增加null判断,避免文件打开失败时的空指针异常
可运行参考代码
import java.io.File; import java.io.FileNotFoundException; import java.util.ArrayList; import java.util.Scanner; public class PlaceForErrors { public static void main(String[] args) { Scanner scan = null; try { // 正斜杠路径,无需转义,避免盘符解析偏差 scan = new Scanner(new File("C:/Users/marga/Desktop/objekt program/oo2021/w05_kontrolltoo1/textHere.txt")); // 非字母数字连续序列作为分隔符,自动过滤标点、空白 scan.useDelimiter("[^a-zA-Z0-9]+"); ArrayList<String> text = new ArrayList<String>(); while (scan.hasNext()) { String token = scan.next().trim(); if (!token.isEmpty()) { text.add(token); } } for(String element : text){ System.out.println(element); } System.out.println("列表为空校验结果:" + text.isEmpty()); } catch (FileNotFoundException exception) { System.out.println(exception); } finally{ if (scan != null) { scan.close(); } } } }
内容的提问来源于stack exchange,提问作者Margarita Zahharova
相关产品推荐
相关产品推荐

