2015-01-20 11 views
9

Моих журналов показать это исключение: ArrayIndexOutOfBoundsException: length=0; index=0 вызывается следующим фрагментом кода:Когда String.split возвращает пустой массив?

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

Я пытаюсь выяснить состояние, для которого String.split возвращает пустой массив. Я понимаю, что если совпадение не найдено, возвращается массив размера 1 с исходной строкой.

Это Java, скомпилированный для SDK версии для Android версии 21. Я с нетерпением жду, чтобы узнать, какую очевидную деталь мне не хватает.

+1

http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#split(java.lang.String), и похоже, что вы нашли свой ответ :) он ничего не возвращает если совпадение не найдено – thermite

+2

http://ideone.com/jEiMFw <, если fullName является разделителем '' '' (или разделителем * N '" ..несколько пространств ") – Selvin

+0

@thermite Я видел эту документацию, но не вижу, где она упоминает особые случаи. Кроме того, используя классный веб-сайт Selvin, мы видим, что это неверно: http://ideone.com/8mRkd4. – siger

ответ

14

split(regex) возвращает результат split(regex,0), где 0 является limit. В настоящее время в соответствии с documentation (ограничение представлено n)

Если n равен нулю, то шаблон будет применен столько раз, сколько это возможно, массив может иметь любую длину, и замыкающие пустые строки будут отброшены.

(курсив мой)

Это означает, что в случае кода, как

"ababaa".split("a") 

сначала вы получите массив ["", "b","b","",""] но отставая пустая строка жижа будет удалена, так что вы будете в конечном итоге с массивом ["","b","b"]

НО, если ваша строка содержит только элементы, которые split может совпадать с ее рисунком, например

"ababab".split("ab") 

на первый массиве будет содержать ["","","",""] (три шпагата), но тогда пустые элементы хвостовых будут удалены, что означает, что все элементы будут удалены, который будет оставить вас с [] (массивом с размером 0).

Чтобы получить пустой массив, вам нужно разделить на строку, содержащую только подстроки, которые могут быть сопоставлены параметром split, поэтому в случае split(" ") исходная строка должна быть построена только из пробелов, а ее длина должна быть не менее 1.

BTW, если исходная строка будет пустой, как «" split(" "), не произойдет, так что массив с исходной строкой будет возвращен, что означает, что вы все равно получите массив [""] с одним элементом, а не с пустым массивом.

Вы можете сказать «», но вы сказали, что удаляемая пустая строка удаляется, поэтому почему это «» не удаляется (оно заканчивается, и оно пустое)? ». Ну да, но удаление конечных пустых строк имеет смысл только в том случае, если эти строки были созданы в результате разбиения, поэтому, если разделение не произошло, «очистка» не требуется, поэтому массив результатов будет содержать исходную строку, как описано в моем earlier answer этот предмет.

+0

Благодарим вас за подробный ответ, это объясняет это. Я приму свой ответ, если Селвин не напишет свой комментарий в качестве ответа в ближайшее время. – siger

Смежные вопросы