Exceções marcadas e desmarcadas em Java

Exceções marcadas e desmarcadas em Java

1. Visão geral

Java exceptions se enquadram em duas categorias principais:checked exceptions and unchecked exceptions. Neste artigo, forneceremos alguns exemplos de código sobre como usá-los.

2. Exceções verificadas

Em geral, as exceções verificadas representam erros fora do controle do programa. Por exemplo, o construtor deFileInputStream lançaFileNotFoundException se o arquivo de entrada não existir.

Java verifica as exceções verificadas em tempo de compilação.

Portanto, devemos usar a palavra-chavethrows para declarar uma exceção verificada:

private static void checkedExceptionWithThrows() throws FileNotFoundException {
    File file = new File("not_existing_file.txt");
    FileInputStream stream = new FileInputStream(file);
}

Também podemos usar um blocotry-catch para lidar com uma exceção verificada:

private static void checkedExceptionWithTryCatch() {
    File file = new File("not_existing_file.txt");
    try {
        FileInputStream stream = new FileInputStream(file);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
}

Algunscommon checked exceptions em Java sãoIOException,SQLException eParseException.

A classeException é a superclasse das exceções verificadas. Portanto, podemoscreate a custom checked exception estendendoException:

public class IncorrectFileNameException extends Exception {
    public IncorrectFileNameException(String errorMessage) {
        super(errorMessage);
    }
}

3. Exceções não verificadas

Se um programa lança uma exceção desmarcada, isso reflete algum erro dentro da lógica do programa. Por exemplo, se dividirmos um número por 0, Java lançaráArithmeticException:

private static void divideByZero() {
    int numerator = 1;
    int denominator = 0;
    int result = numerator / denominator;
}

Java does not verify unchecked exceptions at compile-time. Além disso, não precisamos declarar exceções não verificadas em um método com a palavra-chavethrows . E embora o código acima não tenha erros durante o tempo de compilação, ele lançaráArithmeticException em tempo de execução.

Algunscommon unchecked exceptions em Java sãoNullPointerException,ArrayIndexOutOfBoundsException eIllegalArgumentException.

A classeRuntimeException é a superclasse de todas as exceções não verificadas. Portanto, podemoscreate a custom unchecked exception estendendoRuntimeException:

public class NullOrEmptyException extends RuntimeException {
    public NullOrEmptyException(String errorMessage) {
        super(errorMessage);
    }
}

4. Quando usar exceções verificadas e exceções não verificadas

É uma boa prática usar exceções em Java para que possamos separar o código de tratamento de erros do código regular. No entanto, precisamos decidir que tipo de exceção lançar. OOracle Java Documentation fornece orientação sobre quando usar exceções verificadas e exceções não verificadas:

“Se for razoável esperar que um cliente se recupere de uma exceção, torne-a uma exceção verificada. Se um cliente não puder fazer nada para se recuperar da exceção, torne-a uma exceção não verificada. ”

Por exemplo, antes de abrir um arquivo, podemos primeiro validar o nome do arquivo de entrada. Se o nome do arquivo de entrada do usuário for inválido, podemos lançar uma exceção verificada personalizada:

if (!isCorrectFileName(fileName)) {
    throw new IncorrectFileNameException("Incorrect filename : " + fileName );
}

Dessa forma, podemos recuperar o sistema aceitando outro nome de arquivo de entrada do usuário. No entanto, se o nome do arquivo de entrada for um ponteiro nulo ou for uma sequência vazia, significa que temos alguns erros no código. Nesse caso, devemos lançar uma exceção desmarcada:

if (fileName == null || fileName.isEmpty())  {
    throw new NullOrEmptyException("The filename is null or empty.");
}

5. Conclusão

Neste artigo, discutimos a diferença entre exceções verificadas e não verificadas. Também fornecemos alguns exemplos de código para mostrar quando usar exceções marcadas ou desmarcadas.

Como sempre, todos os códigos encontrados neste artigo podem ser encontradosover on GitHub.