Я вижу здесь только решения, но нет полного объяснения проблемы, поэтому я решил опубликовать этот ответ
Проблема
Вам нужно знать несколько вещей text.split(delim)
. split
метод:
- принимает в качестве аргумента регулярное выражение (regex), которое описывает разделитель, по которому мы хотим разбить,
- if
delim
существует в конце text
like in a,b,c,,
(где разделитель ,
) split
сначала создаст массив like, ["a" "b" "c" "" ""]
но поскольку в большинстве случаев нам действительно не нужны эти завершающие пустые строки, он также автоматически удаляет их для нас. Таким образом, он создает другой массив без этих завершающих пустых строк и возвращает его .
Вам также необходимо знать, что точка.
- это специальный символ в регулярном выражении . Он представляет собой любой символ (кроме разделителей строк, но это можно изменить с помощью Pattern.DOTALL
флага).
Итак, для строки, например, "abc"
если мы разделим "."
split
метод, будет
- создать массив, например
["" "" "" ""]
,
- но поскольку этот массив содержит только пустые строки, и все они замыкаются, они будут удалены (как показано в предыдущем втором пункте)
который означает , что мы получим в результате пустого массива []
(без каких - либо элементов, даже не пустая строка), поэтому мы не можем использовать , fn[0]
потому что нет индекса 0.
Решение
Чтобы решить эту проблему, вам просто нужно создать регулярное выражение, которое будет представлять точку. Для этого нам нужно избежать этого .
. Есть несколько способов сделать это, но самый простой, вероятно, - использовать \
(который в String нужно записать как, "\\"
потому что там \
тоже особенный и требует, чтобы другой \
был экранирован).
Итак, решение вашей проблемы может выглядеть так
String[] fn = filename.split("\\.");
Бонус
Вы также можете использовать другие способы избежать этой точки, например
- используя класс персонажа
split("[.]")
- заключить это в цитату
split("\\Q.\\E")
- используя правильный экземпляр Pattern с
Pattern.LITERAL
флагом
- или просто используйте
split(Pattern.quote("."))
и позвольте регулярному выражению сбежать за вас.