Ich versuche, Pi durch den folgenden Code mit * Pi zu ersetzen, jedoch löst es völlig unerwartete Ausnahme. Wie sieht der Matcher auf einen Index, der höher ist als die Stringlänge?IndexOutOfBoundException auf StringBuilder
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();
}
}
Ausnahme:
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)
Es ist klar, dass die Länge der Zeichenfolge kleiner als dann Wert beginnen. Es verursacht also den Fehler –