2017-03-25 1 views
0

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) 
+0

Es ist klar, dass die Länge der Zeichenfolge kleiner als dann Wert beginnen. Es verursacht also den Fehler –

Antwort

2

Das Problem ist, dass Sie einen ersten Index unterwegs sind, die über die Länge der Zeichenfolge ist, in dem Sie eine Übereinstimmung zu finden versuchen. Die Methodendokumentation besagt Folgendes:

Wirf: IndexOutOfBoundsException - Wenn Start kleiner als Null ist oder wenn Start größer als die Länge der Eingabesequenz ist.

Sie benötigen einen Scheck hinzufügen, um festzustellen, ob der Anfangsindex gilt:

while (start < sb.length() && m.find(start)) { 
    sb.replace(m.start(), m.end(), replacement); 
    start = m.start() + replacement.length(); 
} 
0

Sie einen Fehler über Startposition haben. können Sie es überprüfen. folgende Quelltext:

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); 
} 

}

und Sie würden besser, einen Code schreiben. Sie müssen keine replaceAll Funktion

Ersetzt das Suchzeichen durch das Ersetzungszeichen im gesamten Builder.

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)