java - while 循环和 substring() 导致 StringIndexOutOfBoundsException

标签 java string while-loop

我试图仅从字符串的开头替换非字母数字字符。我想出了以下代码:

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/

相关文章:

java - enum - 不能从非静态上下文中引用非静态方法

java - Java 将字符串转换为整数

string - Swift 2.2 循环遍历字符串并获取字符和索引

javascript按名称而不是id模拟文本输入

Python:在 while 循环中使用 join() 的线程

java - 为什么我的 while 循环不停止?

java - Android http 响应出现堆栈溢出错误

java - 计算树上的匹配节点

c++ - 段错误 : C++ sort an string vector with lambda comparator

java - 用于处理/Java 中的金字塔金字塔的 For 循环