Java用substring实现空格移除时抛出StringIndexOutOfBounds的原因
异常触发原因及代码问题说明
代码存在的核心问题
- 首先是条件判断语法错误:你在
if判断中使用了赋值运算符=而非相等判断运算符==:
这行代码会直接将if (isSpace = false)isSpace强制赋值为false,再判断赋值结果(恒为false),因此if代码块永远不会执行,updated最终只会返回空字符串,完全不符合移除空格的预期逻辑。 - 其次是你遇到的
StringIndexOutOfBoundsException异常:你贴出的代码本身不会触发该异常,因为循环条件i < s.length()保证了i的最大值为s.length()-1,此时substring(i, i+1)的结束索引为s.length(),属于Javasubstring方法的合法取值范围。出现该异常只有两种常见可能:- 你实际运行的代码循环条件写为了
i <= s.length():当i等于s.length()时,i+1为s.length()+1,超出了字符串的最大合法结束索引,触发越界 - 你在循环内部修改了
s的指向,给s重新赋值为长度更小的字符串,导致后续循环中i超过了新的s的长度
- 你实际运行的代码循环条件写为了
代码优化建议
你不需要用substring逐位截取,直接用charAt方法获取对应位置的字符判断即可,性能更好,也不会有索引风险:
private String remove_spaces(String s){ if (s == null) return ""; s = s.trim(); StringBuilder updated = new StringBuilder(); for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); if (c != ' ') { updated.append(c); } } return updated.toString(); }
如果不需要自定义实现,直接调用JDK自带方法更简单:s.replaceAll("\\s", "")即可移除所有类型的空白字符。
内容的提问来源于stack exchange,提问作者Marie Scala
相关产品推荐
相关产品推荐

