HOWTO · Java

Java.Lang.StringIndexOutOfBoundsException behoben: String-Index außerhalb des zulässigen Bereichs

Dieser Artikel erklärt, warum `charAt(0)` bei einer leeren Zeichenkette eine `StringIndexOutOfBoundsException` auslöst, und zeigt, wie Sie Zeichenindizes prüfen und den Zugriff mit einer Längenprüfung absichern.

Auf dieser Seite

Wird charAt(0) für eine leere Zeichenkette aufgerufen, löst Java StringIndexOutOfBoundsException aus, weil an Index 0 kein Zeichen vorhanden ist. Prüfen Sie die Länge der Zeichenkette, bevor Sie ein Zeichen lesen. Bei jeder nicht leeren Zeichenkette reichen die gültigen Zeichenindizes von 0 bis length() - 1.

Den Fehler java.lang.StringIndexOutOfBoundsException: String index out of range beheben

Die Indizes einer Java-Zeichenkette beginnen bei 0. Hat eine Zeichenkette die Länge n, liegen ihre Zeichenindizes zwischen 0 und n - 1; ein Index gleich length() liegt bereits außerhalb des gültigen Bereichs. Deshalb schlägt charAt(0) bei einer leeren Zeichenkette fehl. Das kürzeste Beispiel dafür ist String value = ""; value.charAt(0);: Java soll damit ein Zeichen lesen, das in der Zeichenkette nicht vorhanden ist. Dieses Fragment veranschaulicht die Ursache; es wird weder ein Ausnahme-Trace noch ein Laufergebnis behauptet.

Das folgende Programm verwendet eine feste Zeichenkette und zeigt, wie der Zugriff auf das erste Zeichen funktioniert, wenn der Index gültig ist. Eingabe und Zugriff stehen dabei direkt beieinander, sodass der Zusammenhang zwischen dem Inhalt der Zeichenkette und dem zurückgegebenen Zeichen deutlich wird. In einer echten Methode kann die Zeichenkette stattdessen aus einem Formular, einer Datei, einer Netzwerkantwort oder einer anderen Methode stammen. In jedem Fall gilt dieselbe Regel: Verwenden Sie einen Index erst, nachdem Sie sichergestellt haben, dass die Zeichenkette an dieser Stelle ein Zeichen enthält. Führen Sie dieses Beispiel aus:

class StringIndexExample {
    public static void main(String[] args) {
        String value = "DelftStack";
        System.out.println(value.charAt(0));
    }
}
D

Prüfen Sie vor dem Zugriff, ob die Zeichenkette nicht leer ist, wenn Sie auf Index 0 zugreifen möchten. Die abgesicherte Variante unten gibt eine Ersatzmeldung aus, wenn kein erstes Zeichen vorhanden ist. In diesem Zweig wird charAt(0) nicht aufgerufen; im anderen Zweig wird das erste Zeichen gelesen. Die gezeigte Ausgabe stammt aus dem bereitgestellten Lauf dieses Beispiels. Das dort verwendete Ersatzlabel bleibt im unveränderten Beispiel auf Englisch.

class SafeStringIndexExample {
    public static void main(String[] args) {
        String value = "";
        if (!value.isEmpty()) {
            System.out.println(value.charAt(0));
        } else {
            System.out.println("No character at index 0");
        }
    }
}
No character at index 0

Wenn der Index aus einer Benutzereingabe stammt, prüfen Sie den Wert, bevor Sie ihn verwenden. Bei einer Zeichenkette der Länge n ist ein Zeichenindex nur dann gültig, wenn 0 <= index && index < n gilt. Wird der Index aus Text gelesen, wandeln Sie diesen zuerst in eine Zahl um und legen Sie fest, wie Ihre Anwendung reagieren soll, falls der Text keine Zahl ist. Prüfen Sie anschließend den Bereich für genau die Zeichenkette, auf die Sie zugreifen wollen: Wenn Sie eine andere oder inzwischen geänderte Zeichenkette prüfen, kann die Prüfung beim Zugriff bereits veraltet sein. Benötigt der aufrufende Code ein Ersatzzeichen, wählen Sie eines mit einer klar definierten Bedeutung in Ihrer Anwendung, etwa einen dokumentierten Platzhalter. Gibt es kein sinnvolles Ersatzzeichen, geben Sie einen Status zurück, bitten Sie um eine korrigierte Eingabe oder überspringen Sie den Vorgang, statt stillschweigend Daten zu ersetzen.

Für andere Zeichenkettenoperationen gelten verwandte, aber unterschiedliche Grenzen. substring(beginIndex) akzeptiert 0 <= beginIndex <= length(). Für substring(beginIndex, endIndex) und subSequence(beginIndex, endIndex) muss 0 <= beginIndex <= endIndex <= length() gelten. Der Endindex ist exklusiv und darf daher der Länge der Zeichenkette entsprechen. Bei String.valueOf(charArray, offset, count) müssen offset und count nicht negativ sein, und der angeforderte Bereich muss vollständig in das Array passen. Werden diese Grenzen verletzt, können diese Methoden StringIndexOutOfBoundsException auslösen. Prüfen Sie die Argumente passend zur jeweiligen Operation, statt anzunehmen, dass für jede Zeichenkettenmethode dieselben Grenzen gelten.

StringIndexOutOfBoundsException ist eine ungeprüfte Ausnahme und muss deshalb nicht in der Methodendeklaration angegeben werden. Ein try-catch-Block kann sinnvoll sein, wenn ein unerwarteter ungültiger Index von einer Stelle stammt, die sich vorher nicht prüfen lässt, oder wenn die Fehlerbehandlung auf dieser Ebene erfolgen soll. Er sollte gewöhnliche Eingabe- und Bereichsprüfungen nicht ersetzen: Die Ausnahme nach dem Zugriff abzufangen macht das angeforderte Zeichen nicht verfügbar. Um einen gemeldeten Fehler bei Index 0 zu untersuchen, prüfen Sie, wo die Zeichenkette erzeugt wird, ob Trimmen oder Parsen sie verändert hat und welcher Zweig zum Zugriff führt. Meldung und Stacktrace können je nach Java-Version variieren. Vergleichen Sie daher den tatsächlichen Index mit der aktuellen length() der Zeichenkette, statt sich auf einen bestimmten Wortlaut des Traces zu verlassen.