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