Ich weiß, dass dieser Thread ziemlich alt ist, aber das ist solch ein grundlegendes Problem, dass ich denke, dass es Klärung rechtfertigt.
Die Frage ist genau richtig. Ich sehe dies als Softwarefehler in der Methode Java String Substring (int beginIndex, int endIndex).
http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#substring%28int,%20int%29.
Vom Java Docs https://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html
Java/C/C++ und jede andere Sprache, die ich kenne, ist nicht der Array-Index als 'Teiler' zwischen Arrayelementen anzuzeigen.
Parameter: beginIndex - der Anfangsindex, inklusive. endIndex - der Endungsindex, exklusiv.
Entweder endIndex ist falsch benannt, weil die Sprache keinen Speicherzugriff auf die Adresse am endIndex + 1 zulässt, die erforderlich ist, um das letzte Arrayelement einzubeziehen ODER endIndex ist falsch definiert und muss sein: endIndex - der Endindex, einschließlich .
Der wahrscheinlichste Fall ist, dass der zweite Parameter falsch benannt wurde. Es sollte sein: length - die Länge der gewünschten Zeichenfolge beginnend am beginIndex.
Wir wissen, dass Gosling die Java-Syntax auf die C/C++ - Sprachen für Vertrautheit basiert. Von C+++ String Klasse http://www.cplusplus.com/reference/string/string/substr/ sehen wir die Methodendefinition ist:
Zeichenfolge substr (Größe_tpos = 0, size_t len = npos) const;
Beachten Sie, dass der zweite Parameter in der Methodendefinition für die Länge 'len' ist.
len Anzahl der Zeichen, die im Teilstring enthalten sein sollen (wenn der String kürzer ist, werden so viele Zeichen wie möglich verwendet).
testString hat 10 Zeichen, Indexpositionen 0 bis 9. Das Angeben eines endIndex von 10 sollte immer die IndexOutOfBoundsException() auslösen, da testString keinen endIndex von 10 hat.
Wenn wir die Methode in JUnit mit konkreten Werten Blick auf die C++ Methode zu testen, erwarten wir:
String teststring = "teststring"; assertThat (testString.string (4, 6), equalTo ("String"));
aber natürlich werden wir voraussichtlich erhalten: "String" war aber "St"
Die Länge der aus dem Index 0 teststring 'g' in 'String' char ist 10 Zeichen. Wenn wir 10 als 'endIndex' Parameter verwenden,
String testString = "testString"; assertThat (testString.substring (4, 10), equalTo ("String"));
"Pass" von JUnit.
Wenn wir Parameter 2 in "lengthOfSubstringFromIndex0" umbenennen, müssen Sie die endIndex-1-Zählung nicht ausführen, und es wird niemals die IndexOutOfBoundsException() ausgelöst, die bei der Angabe eines endIndex, 10, außerhalb des Bereichs für das zugrunde liegende Array. http://docs.oracle.com/javase/7/docs/api/java/lang/IndexOutOfBoundsException.html
Dies ist nur eine dieser Zeiten, dass Sie die Idiosynkrasie dieser Methode erinnern müssen. Der zweite Parameter wird nicht korrekt benannt. Die Java-Methodensignatur sollte wie folgt lauten:
Oder die Methode neu definiert, um C++ string :: substr-Methode zu entsprechen. Neudefinition würde natürlich bedeuten, das gesamte Internet neu zu schreiben, also ist es nicht wahrscheinlich.
Ahh! Danke für die Tipp-Leute, ich schaute auf die gleiche Doc-Seite, wusste aber nicht, dass ich den ganzen Weg runterscrollen musste, um mehr Details zu bekommen ... –
Wünschte, dass der Javadoc eine Notiz darüber haben kann, oder unvorsichtige Typen wie ich werden expect 'IndexOutOfBoundsException' ist aufgetreten, wenn beginIndex = String.length(). –