FileNotFoundException em Java
1. Introdução
Neste artigo, vamos falar sobre uma exceção muito comum em Java - oFileNotFoundException.
Abordaremos os casos em que isso pode ocorrer, as possíveis formas de tratá-lo e alguns exemplos.
**2. Quando é lançada a exceção?
Conforme indicado na documentação da API do Java, essa exceção pode ser lançada quando:
-
Existe um arquivo com o caminho especificadodoesnot
-
Um arquivo com o nome de caminho especificadodoes existebutis inaccessible por algum motivo (gravação solicitada para um arquivo somente leitura ou permissões não permitem o acesso ao arquivo)
3. Como lidar com isso?
Em primeiro lugar, levando em consideração que estendejava.io.IOException que estendejava.lang.Exception, você precisará lidar com um blocotry-catch como com qualquer outro Exception verificado.
Então, o que fazer (relacionado ao negócio / lógica) dentro do blocotry-catch realmente depende do que você precisa fazer.
Pode ser necessário:
-
Levantar uma exceção específica do negócio: pode ser um erro de interrupção da execução, mas você deixará a decisão nas camadas superiores do aplicativo (não se esqueça de incluir a exceção original)
-
Alerte um usuário com uma caixa de diálogo ou mensagem de erro: este não é um erro de interrupção de execução, portanto, apenas notificar é suficiente
-
Crie um arquivo: lendo um arquivo de configuração opcional, não localizando-o e criando um novo com valores padrão
-
Crie um arquivo em outro caminho: você precisa escrever algo e, se o primeiro caminho não estiver disponível, tente com um caminho seguro
-
Basta registrar um erro: esse erro não deve interromper a execução, mas você o registra para análises futuras
4. Exemplos
Agora veremos alguns exemplos, todos baseados na seguinte classe de teste:
public class FileNotFoundExceptionTest {
private static final Logger LOG
= Logger.getLogger(FileNotFoundExceptionTest.class);
private String fileName = Double.toString(Math.random());
protected void readFailingFile() throws IOException {
BufferedReader rd = new BufferedReader(new FileReader(new File(fileName)));
rd.readLine();
// no need to close file
}
class BusinessException extends RuntimeException {
public BusinessException(String string, FileNotFoundException ex) {
super(string, ex);
}
}
}
4.1. Registrando a exceção
Se você executar o seguinte código, ele registrará o erro no console:
@Test
public void logError() throws IOException {
try {
readFailingFile();
} catch (FileNotFoundException ex) {
LOG.error("Optional file " + fileName + " was not found.", ex);
}
}
4.2. Levantando uma exceção específica de negócios
A seguir, um exemplo de criação de uma exceção específica de negócios para que o erro possa ser tratado nas camadas superiores:
@Test(expected = BusinessException.class)
public void raiseBusinessSpecificException() throws IOException {
try {
readFailingFile();
} catch (FileNotFoundException ex) {
throw new BusinessException(
"BusinessException: necessary file was not present.", ex);
}
}
4.3. Criando um arquivo
Por fim, tentaremos criar o arquivo para que possa ser lido (talvez para um thread que esteja continuamente lendo um arquivo), mas novamente capturando a exceção e tratando do possível segundo erro:
@Test
public void createFile() throws IOException {
try {
readFailingFile();
} catch (FileNotFoundException ex) {
try {
new File(fileName).createNewFile();
readFailingFile();
} catch (IOException ioe) {
throw new RuntimeException(
"BusinessException: even creation is not possible.", ioe);
}
}
}
5. Conclusão
Neste rápido artigo, vimos quando umFileNotFoundException pode ocorrer e várias opções para lidar com isso.
Como sempre, os exemplos completos sãoover on Github.