Почему вторая строка этого кода в Java бросает ArrayIndexOutOfBoundsException
?
String filename = "D:/some folder/001.docx";
String extensionRemoved = filename.split(".")[0];
Пока работает ниже:
String driveLetter = filename.split("/")[0];
Я использую Java 7.
Вам нужно избегать точки, если вы хотите разбить на буквальную точку:
String extensionRemoved = filename.split("\\.")[0];
В противном случае вы разбиваете на regex .
, что означает "любой символ".
Обратите внимание на двойную обратную косую черту, необходимую для создания одной обратной косой черты в регулярном выражении.
Вы получаете ArrayIndexOutOfBoundsException
, потому что ваша строка ввода - это просто точка, т.е. "."
, которая является регистром, который создает пустой массив при разбиении на точку; split(regex)
удаляет все завершающие пробелы из результата, но так как разделение точки на точке оставляет только две пробелы, после удаления заготовок пробелы вы остаетесь с пустым массив.
Чтобы избежать получения ArrayIndexOutOfBoundsException
для этого случая края, используйте перегруженную версию split(regex, limit)
, у которой есть второй параметр, который является пределом размера для результирующий массив. Когда limit
отрицательно, поведение удаления завершающих пробелов из результирующего массива отключено:
".".split("\\.", -1) // returns an array of two blanks, ie ["", ""]
т.е. когда filename
является просто точкой "."
, вызов filename.split("\\.", -1)[0]
возвращает пустой, но вызов filename.split("\\.")[0]
будет вызывать ArrayIndexOutOfBoundsException
.
ArrayIndexOutOfBoundsException
. Тем не менее, вы не правы: вам не нужно знать, где находится последняя точка; вам просто нужно правильное регулярное выражение: filename.split("\\.(?=[^.]*$)")
. При этом используется забегая вперед, чтобы утверждать, что нигде на входе, который следует за совпадающей точкой, нет точек.
"является специальным символом в java, поэтому вам нужно использовать" \\". чтобы избежать этого символа:
final String extensionRemoved = filename.split("\\.")[0];
Я надеюсь, что это поможет
Это потому, что .
является зарезервированным символом в регулярном выражении, представляющим любой символ.
Вместо этого мы должны использовать следующее утверждение:
String extensionRemoved = filename.split("\\.")[0];
Я считаю, что вам следует избегать точки. Попробуйте:
String filename = "D:/some folder/001.docx";
String extensionRemoved = filename.split("\\.")[0];
В противном случае точка интерпретируется как любой символ в регулярных выражениях.