Vejo apenas soluções aqui, mas nenhuma explicação completa do problema, então decidi postar esta resposta
Problema
Você precisa saber algumas coisas sobre text.split(delim)
. split
método:
- aceita como argumento a expressão regular (regex) que descreve o delimitador no qual queremos dividir,
- se
delim
existe no final de text
like in a,b,c,,
(onde o delimitador é ,
) split
a princípio criará um array like, ["a" "b" "c" "" ""]
mas como na maioria dos casos não precisamos realmente dessas strings vazias, ele também as remove automaticamente para nós. Portanto, ele cria outro array sem essas strings vazias no final e o retorna .
Você também precisa saber que o ponto.
é um caractere especial no regex . Ele representa qualquer caractere (exceto separadores de linha, mas isso pode ser alterado com o Pattern.DOTALL
sinalizador).
Então, para strings como "abc"
se dividíssemos no "."
split
método,
- criar matriz como
["" "" "" ""]
,
- mas como esta matriz contém apenas strings vazias e todas elas estão no final, elas serão removidas (como mostrado no segundo ponto anterior)
o que significa que obteremos como resultado um array vazio []
(sem elementos, nem mesmo uma string vazia), então não podemos usar fn[0]
porque não há índice 0.
Solução
Para resolver este problema, você simplesmente precisa criar um regex que representará o ponto. Para fazer isso, precisamos escapar disso .
. Existem algumas maneiras de fazer isso, mas a mais simples é provavelmente usando \
(que em String precisa ser escrito "\\"
porque \
também é especial lá e requer que outro \
tenha escape).
Portanto, a solução para o seu problema pode parecer
String[] fn = filename.split("\\.");
Bônus
Você também pode usar outras maneiras de escapar desse ponto, como
- usando classe de personagem
split("[.]")
- envolvendo-o em citação
split("\\Q.\\E")
- usando a instância de padrão adequada com
Pattern.LITERAL
bandeira
- ou simplesmente use
split(Pattern.quote("."))
e deixe o regex fazer o escape para você.