FileNotFoundException em Java

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.