2015-01-20 15 views
9

Meine Logs zeigen diese Ausnahme: ArrayIndexOutOfBoundsException: length=0; index=0 durch das folgende Stück Code ausgelöst:Wann gibt String.split ein leeres Array zurück?

public static String getInitialsFromFullName(String fullName) 
{ 
    String[] splitNames = fullName.split(" "); 
    String firstName = splitNames[0]; <-- Here 
    ... 
} 

ich die Bedingung, um herauszufinden versuche, für die String.split ein leeres Array zurückgibt. Ich verstehe, dass, wenn keine Übereinstimmung gefunden wird, ein Array der Größe 1 mit der ursprünglichen Zeichenfolge zurückgegeben wird.

Dies ist Java kompiliert für die Android Build SDK Version 21. Ich freue mich zu hören, was offensichtliche Detail fehlt mir.

+1

http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#split(java.lang.String) und es sieht so aus, als ob Sie Ihre Antwort gefunden haben :) es gibt nichts zurück Wenn keine Übereinstimmung gefunden wird – thermite

+2

http://ideone.com/jEiMFw Selvin

+0

@thermite Ich habe diese Dokumentation gesehen, aber ich sehe nicht, wo es die speziellen Fälle erwähnt. Auch mit Selvins cooler Website können wir sehen, dass es nicht korrekt ist: http://ideone.com/8mRkd4. – siger

Antwort

14

split(regex) gibt das Ergebnis split(regex,0) zurück, wobei 0limit ist. Nun nach documentation (limit durch n dargestellt wird)

Wenn n null ist, dann wird das Muster so oft wie möglich angewendet werden, kann das Array eine beliebige Länge haben, und nachlauf leere Strings verworfen.

(Hervorhebung von mir)

Es bedeutet, dass im Falle von Code wie

"ababaa".split("a") 

zuerst werden Sie Array ["", "b","b","",""] erhalten, aber dann leeren String Gesöff entfernt werden Hinter, so dass Sie am Ende wird mit Array ["","b","b"]

ABER wenn Ihre Zeichenfolge nur Elemente enthält, die split mit seinem Muster übereinstimmen können, wie

"ababab".split("ab") 

auf den ersten Array ["","","",""] (drei Splits) enthalten, aber dann werden leere nachlauf Elemente entfernt werden, was bedeutet, dass alle Elemente entfernt werden, die Sie mit [] (Array mit Größe 0) verlassen wird.

So leeres Array als Ergebnis erhalten Sie auf String aufgeteilt werden müssen, die nur Teil enthält, die durch split Parameter angepasst werden kann, so im Fall von split(" ") Original-Zeichenkette nur aus Räumen gebaut werden muß, und seine Länge muss mindestens sein 1.

BTW wenn ursprüngliche Zeichenfolge wäre leer wie "" split(" ") würde nicht passieren, so Array mit ursprünglichen String würde zurückgegeben werden, was bedeutet, dass Sie immer noch [""] Array mit einem Element, nicht leere Array erhalten.

Sie können sagen ", aber Sie haben gesagt, dass nachfolgende leere Zeichenfolge entfernt werden, also warum das" "nicht entfernt wird (es ist nachgezogen, und es ist leer)?". Nun ja, aber das Entfernen nachstehender leerer Zeichenfolgen ist nur sinnvoll, wenn diese Zeichenfolgen als Ergebnis der Teilung erstellt wurden, also wenn das Aufteilen nicht erfolgte, ist "Bereinigung" nicht erforderlich, daher enthält das Ergebnis die ursprüngliche Zeichenfolge, wie in meinem earlier answer beschrieben Dieses Thema.

+0

Danke für die ausführliche Antwort, das erklärt es. Ich werde Ihre Antwort akzeptieren, wenn Selvin seinen Kommentar nicht bald als Antwort schreibt. – siger

Verwandte Themen