如何修正ErrorProne的StringSplitter告警?不使用Guava
修复ErrorProne StringSplitter告警的正确String.split用法
问题背景
需求是对输入字符串执行两个操作:
- 将所有连续制表符序列替换为分隔符
; - 按
;分割字符串
现有代码触发了ErrorProne的[StringSplitter] String.split(String) has surprising behavior告警:
private static final Pattern MYPATTERN= Pattern.compile("\\t+"); private String question(String input) { final String inputMessageWithoutTab = MYPATTERN.matcher(input).replaceAll(";"); final String[] splitByComma = inputMessageWithoutTab.split(";"); return splitByComma[0]; //not important }
尝试用String.split(String, int)修复时,误写成静态调用String.split(inputMessageWithoutTab, -1)导致编译失败,需要正确的调用方式。
解决方案
ErrorProne告警的核心原因是:无参String.split(String)会自动忽略末尾的空字符串,行为不符合直觉。要修复告警,需调用带limit参数的实例方法版本:
split是String类的实例方法,必须通过字符串对象调用,不能静态调用- 传入
limit = -1:该参数值会保留分割后的所有空字符串(包括末尾的),避免丢失数据
修正后的完整代码:
private static final Pattern MYPATTERN= Pattern.compile("\\t+"); private String question(String input) { final String inputMessageWithoutTab = MYPATTERN.matcher(input).replaceAll(";"); // 正确调用带limit参数的split方法,-1表示保留所有空元素 final String[] splitBySemicolon = inputMessageWithoutTab.split(";", -1); return splitBySemicolon[0]; //not important }
参数说明
limit > 0:最多分割成limit个元素,末尾空字符串会被忽略limit = 0:和无参版本行为一致,分割所有可能的位置,忽略末尾空字符串limit < 0:分割所有可能的位置,保留所有空字符串(包括末尾)
内容的提问来源于stack exchange,提问作者PatPanda
相关产品推荐
相关产品推荐

