首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IndexOutOfBoundException on StringBuilder

IndexOutOfBoundException on StringBuilder
EN

Stack Overflow用户
提问于 2017-03-25 23:43:08
回答 2查看 1.1K关注 0票数 0

我试图使用下面的代码将pi替换为*pi,但是它会引发完全出乎意料的异常。匹配者如何看待比字符串长度更高的索引?

代码语言:javascript
复制
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();
        }
    }

例外:

代码语言:javascript
复制
 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)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-25 23:53:33

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

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

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

代码语言:javascript
复制
while (start < sb.length() && m.find(start)) {
    sb.replace(m.start(), m.end(), replacement);
    start = m.start() + replacement.length();
}
票数 2
EN

Stack Overflow用户

发布于 2017-03-26 00:07:03

你在开始位置上有个错误。你可以检查一下。以下源代码:

代码语言:javascript
复制
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函数

代码语言:javascript
复制
 StrBuilder replaceAll(char search, char replace) 

将搜索字符替换为整个生成器中的替换字符。

https://commons.apache.org/proper/commons-lang/javadocs/api-3.1/org/apache/commons/lang3/text/StrBuilder.html#replaceAll(java.lang.String,%20java.lang.String)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43023255

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档