Почему функция split ведет себя так, как в java?

если я это сделаю

    String a = ""
    String b = a.split(" ")[0];

Он не дает ArrayIndexOutOfBoundException

но когда я это делаю

    String a = " "
    String b = a.split(" ")[0];

Это дает мне ArrayIndexOutOfBoundException

снова, когда я делаю

    String a = " abc"
    String b = a.split(" ")[0];

Это не дает мне исключение ПОЧЕМУ ТАК?

Ответ 1

Это странно.

Вещь в первом примере пустая строка "является строкой, а не нулевой. Поэтому, когда вы говорите: разделите это" "на токен", шаблоны не совпадают, и массив, который вы получаете, является исходной строкой. Точно так же, как если бы вы делали

String a = "abc";
String b = a.split(" ")[0];

Шаблон для разделения не соответствует, поэтому вы получаете один токен, исходную строку.

Вы получаете исключение во втором случае, потому что COMPLETE-контент вашей String - это точно разделитель, который вы передали в split, поэтому вы получаете пустой массив.

Сообщите мне, если вы хотите получить дополнительную информацию, но это в значительной степени.

Ответ 2

После:

String a = " "
String[] arr = a.split(" "); 

arr - пустой массив. Именно поэтому он бросает ArrayIndexOutOfBoundsException при попытке получить доступ к своему первому (и несуществующему) элементу. Теперь, после:

String a = " abc"
String[] arr = a.split(" ");

arr имеет один элемент: "abc", поэтому исключение не возникает при попытке получить доступ к его первому элементу.

Ответ 3

Случай №1

String a = ""
String b = a.split(" ")[0];

Из Javadoc:

Если выражение не соответствует какой-либо части ввода, тогда результирующий массив имеет только один элемент, а именно эту строку.

So split() дает вам одноэлементный массив, состоящий из входной строки (""). Поэтому нет исключения.

Случай №2

String a = " "
String b = a.split(" ")[0];

Из Javadoc:

Таким образом, конечные пустые строки не включаются в массив.

У вас есть две такие конечные пустые строки, и больше ничего. Поэтому вы возвращаете массив нулевого размера, что приводит к исключению.

Случай №3

String a = " abc"
String b = a.split(" ")[0];

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

Ответ 4

Строка a = ";

Строка b = a.split(" ") [0];

Когда вы это делаете, поскольку нет символа "split", поэтому не выполняется действие split, и массив возвращается с первым и единственным элементом в виде пустой строки.

Строка a = ";

Строка b = a.split(" ") [0];

в то время как в этом случае он пытается разбить строку, но не получает значений, которые должны быть размещены в любой из сторон, поэтому массив не создается. таким образом, когда вы пытаетесь получить доступ к своему 0-му элементу, он предоставляет ArrayOutOfBoundException.

Строка a = "abc";

Строка b = a.split("") [0];

В этом случае происходит разделение, и "abc" помещается на 0-е место (я думаю), и вы остаетесь с массивом с размером больше 0. Проблема решена!!.

Ответ 5

Всегда возможно, что String.split() вернет пустой массив, если есть полное соответствие предоставленного regex