我试图仅从字符串的开头替换非字母数字字符。我想出了以下代码:
public static final class FixNonAlphaNumBegin implements PhraseFilter {
@Override
public String filter(String phrase, long frequency) {
int count = 0;
while (!Character.isLetterOrDigit(phrase.codePointAt(count))
&& phrase.length() > count + 1) {
phrase = phrase.replaceFirst(
Pattern.quote(phrase.substring(count, count + 1)), "");
count++;
}
return phrase.trim();
}
}
IndexOutOfBoundsException 是从哪里来的?这应该是不可能的:
例如
String filter = "! "
!Character.isLettorDigit(phrase.codePointAt(0) --> true
phrase.length() > 1 --> true
phrase = phrase.replaceFirst(
Pattern.quote(phrase.substring(0, 0 + 1)), "");
phrase
现在是 ""
,count
1
!Character.isLettorDigit(phrase.codePointAt(1) --> true
phrase.length() > 2 --> false
因此循环应该在异常发生之前中断。
有什么提示吗?
最佳答案
交换 while
条件
while (count < pharse.length() && !Character.isLetterOrDigit(phrase.codePointAt(count))) {
这将导致 Java 在尝试从中提取字符之前首先检查 count
是否小于 phrase
的长度(记住,它的索引为 0)
关于java - while 循环和 substring() 导致 StringIndexOutOfBoundsException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12944409/