Warum wirft die zweite Zeile dieses Codes ArrayIndexOutOfBoundsException
?
String filename = "D:/some folder/001.docx";
String extensionRemoved = filename.split(".")[0];
Während dies funktioniert:
String driveLetter = filename.split("/")[0];
Ich benutze Java 7.
Sie müssen den Punkt maskieren, wenn Sie einen Literalpunkt teilen möchten:
String extensionRemoved = filename.split("\\.")[0];
Andernfalls teilen Sie sich den regulären Ausdruck .
, was "ein beliebiges Zeichen" bedeutet.
Beachten Sie den doppelten Backslash, der erforderlich ist, um einen einzelnen Backslash in der Regex zu erstellen.
Sie erhalten ein ArrayIndexOutOfBoundsException
, weil Ihre Eingabezeichenfolge nur ein Punkt ist, dh "."
, was ein Edge-Fall ist, der ein leeres Array erzeugt, wenn es auf einen Punkt aufgeteilt wird. split(regex)
entfernt alle nachgestellten Leerzeichen aus dem Ergebnis, aber da beim Aufteilen eines Punkts auf einen Punkt nur zwei Leerzeichen verbleiben, bleibt nach dem Entfernen der nachgestellten Leerzeichen ein leeres Array übrig.
Verwenden Sie die überladene Version von split(regex, limit)
, um zu vermeiden, dass für diesen Edge-Fall ArrayIndexOutOfBoundsException
angezeigt wird. Dabei handelt es sich um einen zweiten Parameter, der die Größenbeschränkung für das resultierende Array darstellt. Wenn limit
negativ ist , ist das Entfernen von nachgestellten Leerzeichen aus dem resultierenden Array deaktiviert:
".".split("\\.", -1) // returns an array of two blanks, ie ["", ""]
wenn filename
nur ein Punkt "."
ist, gibt der Aufruf von filename.split("\\.", -1)[0]
ein Leerzeichen zurück, der Aufruf von filename.split("\\.")[0]
hingegen ein ArrayIndexOutOfBoundsException
.
"." ist ein Sonderzeichen in der Regex-Engine Java, daher müssen Sie "\\" verwenden. um diesem Charakter zu entkommen:
final String extensionRemoved = filename.split("\\.")[0];
Ich hoffe das hilft
Dies liegt daran, dass .
ein reserviertes Zeichen im regulären Ausdruck ist, das ein beliebiges Zeichen darstellt. Stattdessen sollten wir die folgende Anweisung verwenden:
String extensionRemoved = filename.split("\\.")[0];
Ich glaube, du solltest dem Punkt entkommen. Versuchen:
String filename = "D:/some folder/001.docx";
String extensionRemoved = filename.split("\\.")[0];
Andernfalls wird Punkt als beliebiges Zeichen in regulären Ausdrücken interpretiert.