Я вижу здесь только решения, но нет полного объяснения проблемы, поэтому я решил опубликовать этот ответ
Проблема
Вам нужно знать несколько вещей text.split(delim). splitметод:
- принимает в качестве аргумента регулярное выражение (regex), которое описывает разделитель, по которому мы хотим разбить,
- if
delimсуществует в конце textlike 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("."))и позвольте регулярному выражению сбежать за вас.