Detectar causa subjacente para java.io.FileNotFoundException
-
12-09-2019 - |
Pergunta
FileNotFoundException é jogado em todos os tipos de ocasiões - não necessariamente apenas quando o nome do arquivo é inválido, mas também quando e. g. permissões não permitem que um arquivo a ser criado ou ler:
java.io.FileNotFoundException: \\server\share\directory\test.csv (Anmeldung fehlgeschlagen: unbekannter Benutzername oder falsches Kennwort)
at java.io.FileOutputStream.open(Native Method)
at java.io.FileOutputStream.<init>(FileOutputStream.java:179)
at java.io.FileOutputStream.<init>(FileOutputStream.java:131)
at java.io.FileWriter.<init>(FileWriter.java:73)
O exemplo mostra acima um Windows alemã reclamando sobre nome de usuário ou senha inválida.
Existe uma maneira curta de analisar a mensagem exceções a ficar um pouco mais fino informações granulação em por que exatamente a exceção ocorreu? Problema com a mensagem de análise é que, em diferentes localidades as mensagens irão variar.
Solução
Faça o cheque para a existência de arquivos / leitura e escrita permissões a si mesmo antes de criar FileOutputStream
.
File test_csv = new File( "\\server\share\directory\test.csv" );
if ( test_csv.exists( ) && test_csv.canWrite( ) )
{
// Create file writer
...
}
else
{
// notify user
...
}
Observe que às vezes você terá que verificar as permissões de leitura / gravação em um pai de vocês arquivo de destino, se você precisa criar um novo arquivo.
File test_csv = new File( "\\server\share\directory\test.csv" );
File parent_dir = test_csv.getParentFile( )
if ( parent_dir.exists( ) && parent_dir.canWrite( ) )
{
// Create file writer
...
}
else
{
// notify user
...
}
Outras dicas
Você pode querer olhar para as propriedades do arquivo usando o objeto java.io.File antes de tentar ler o arquivo. Há um método canRead em que você pode usar para determinar se ou não o usuário pode ler o arquivo.
Uma abordagem é olhar para o tipo real da exceção: como você pode ver a partir do docs , há um monte de subclasses que fornecem informações mais refinado.
No entanto, você provavelmente não vai chegar longe com isso. Como a maioria das exceções verificadas, geralmente é melhor para log / relatar a exceção e pedir ao usuário para escolhas sobre como corrigi-lo.