Java StringBuilder上的IndexOutOfBoundException

Java StringBuilder上的IndexOutOfBoundException,java,indexoutofboundsexception,stringbuilder,Java,Indexoutofboundsexception,Stringbuilder,我试图使用以下代码将pi替换为*pi,但是它引发了完全意外的异常。匹配器如何看待比字符串长度更高的索引 private void makeEvaluationStringExpressionMXParserCompliant() { Pattern multiply = Pattern.compile(mContext.getString(R.string.string_multiply)); Pattern pi = Pattern.compile(mConte

我试图使用以下代码将pi替换为*pi,但是它引发了完全意外的异常。匹配器如何看待比字符串长度更高的索引

private void makeEvaluationStringExpressionMXParserCompliant() {
        Pattern multiply = Pattern.compile(mContext.getString(R.string.string_multiply));
        Pattern pi = Pattern.compile(mContext.getString(R.string.string_pie));
        Pattern e = Pattern.compile(mContext.getString(R.string.string_e));

        Log.e("wingoku", "pi: "+ pi.toString() + " completeString: "+ mEvaluationStringExpressionBuilder.toString());

       replaceAll(mEvaluationStringExpressionBuilder, pi, "*pi");
    }

    private void replaceAll(StringBuilder sb, Pattern pattern, String replacement) {
        Matcher m = pattern.matcher(sb);
        int start = 0;
        while (m.find(start)) {
            sb.replace(m.start(), m.end(), replacement);
            start = m.start() + replacement.length();
        }
    }
例外情况:

 java.lang.IndexOutOfBoundsException: start=3; length=2
                                                     at java.util.regex.Matcher.find(Matcher.java:339)
                                                     at com.app.calculator.utils.StringExpressionFactory.replaceAll(StringExpressionFactory.java:68)
                                                     at com.app.calculator.utils.StringExpressionFactory.makeEvaluationStringExpressionMXParserCompliant(StringExpressionFactory.java:61)
                                                     at com.app.calculator.utils.StringExpressionFactory.createExpression(StringExpressionFactory.java:31)

问题是您传递的初始索引超出了您试图在其中查找匹配项的字符串的长度。方法文档说明如下:

抛出:
IndexOutOfBoundsException
-如果开始小于零或开始大于输入序列的长度

您需要添加检查以查看初始索引是否有效:

while (start < sb.length() && m.find(start)) {
    sb.replace(m.start(), m.end(), replacement);
    start = m.start() + replacement.length();
}
while(开始
问题在于,您传递的初始索引超出了试图在其中查找匹配项的字符串的长度。方法文档说明如下:

抛出:
IndexOutOfBoundsException
-如果开始小于零或开始大于输入序列的长度

您需要添加检查以查看初始索引是否有效:

while (start < sb.length() && m.find(start)) {
    sb.replace(m.start(), m.end(), replacement);
    start = m.start() + replacement.length();
}
while(开始
关于起始位置,您有一个错误。 你可以查一下。以下源代码:

public static void replaceAll(StringBuilder sb, Pattern pattern, String replacement) {
Matcher m = pattern.matcher(sb);
while(m.find()) {
    sb.replace(m.start(), m.end(), replacement);
}
}

你最好写一段代码。您不需要使用replaceAll函数

 StrBuilder replaceAll(char search, char replace) 
在整个生成器中将搜索字符替换为替换字符


关于起始位置,您有一个错误。 你可以查一下。以下源代码:

public static void replaceAll(StringBuilder sb, Pattern pattern, String replacement) {
Matcher m = pattern.matcher(sb);
while(m.find()) {
    sb.replace(m.start(), m.end(), replacement);
}
}

你最好写一段代码。您不需要使用replaceAll函数

 StrBuilder replaceAll(char search, char replace) 
在整个生成器中将搜索字符替换为替换字符


很明显,字符串的长度小于起始值。因此,导致错误的原因很明显,字符串的长度小于起始值。所以是它造成了这个错误