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). splitmétodo:
- aceita como argumento a expressão regular (regex) que descreve o delimitador no qual queremos dividir,
- se
delimexiste no final de textlike in a,b,c,,(onde o delimitador é ,) splita 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.DOTALLsinalizador).
Então, para strings como "abc"se dividíssemos no "." splitmé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.LITERALbandeira
- ou simplesmente use
split(Pattern.quote("."))e deixe o regex fazer o escape para você.