Como tratar exceções em Java: guia prático para iniciantes

Por Gaspar Barancelli Junior em 16 de maio de 2023

Tratar exceções em Java é uma parte fundamental da programação que permite que você lide com erros e falhas em seu código de maneira eficaz. Neste artigo, exploraremos o que são exceções em Java, como elas funcionam e como você pode tratá-las em seu código.

O que são exceções em Java?

Em Java, uma exceção é um objeto que representa um erro ou uma condição anormal que ocorreu durante a execução do programa. Existem dois tipos de exceções em Java: exceções verificadas e exceções não verificadas. As exceções verificadas são aquelas que são conhecidas pela JVM (Java Virtual Machine) durante a compilação e que você deve tratar explicitamente em seu código. As exceções não verificadas são aquelas que não precisam ser tratadas explicitamente, mas podem ser tratadas se necessário.

Como funcionam as exceções em Java?

Quando ocorre uma exceção em seu código Java, a JVM cria um objeto de exceção correspondente e o lança. Se você não tratá-lo em seu código, ele será propagado para a chamada de método anterior e, eventualmente, para a JVM. A JVM, então, imprime uma mensagem de erro para o console e encerra o programa.

Como tratar exceções em Java?

Para lidar com exceções em Java, você pode usar blocos try-catch-finally. Um bloco try é usado para envolver o código que pode gerar uma exceção. Se ocorrer uma exceção dentro do bloco try, a JVM procurará um bloco catch correspondente para tratar a exceção. Se não houver nenhum bloco catch correspondente, a exceção será propagada para o método chamador. O bloco finally é usado para executar o código que deve ser executado independentemente de ocorrer ou não uma exceção.

Aqui está um exemplo de como tratar exceções em Java:

try {
    // código que pode gerar uma exceção
} catch (TipoDeExcecao e) {
    // código que trata a exceção
} finally {
    // código que deve ser executado independentemente de ocorrer ou não uma exceção
}

É importante notar que você deve ser específico sobre o tipo de exceção que está tratando em seu bloco catch. Isso permite que você trate exceções específicas de maneira diferente, dependendo de suas necessidades.

Para um melhor entendimento, segue uma lista de exemplos de como tratar exceções em Java com explicações sobre cada um:

1. Exemplo de tratamento de exceção de divisão por zero:

try {
    int resultado = 10 / 0;
} catch (ArithmeticException e) {
    System.out.println("Erro: divisão por zero.");
}

Nesse exemplo, o bloco try contém uma operação que pode gerar uma exceção de divisão por zero. Se essa exceção ocorrer, a JVM procurará um bloco catch correspondente para tratá-la. O bloco catch trata a exceção de ArithmeticException, que é a exceção lançada quando ocorre uma divisão por zero. Quando essa exceção é capturada, a mensagem "Erro: divisão por zero." é impressa no console.

2. Exemplo de tratamento de exceção de arquivo não encontrado:

try {
    BufferedReader br = new BufferedReader(new FileReader("arquivo.txt"));
} catch (FileNotFoundException e) {
    System.out.println("Erro: arquivo não encontrado.");
}

Nesse exemplo, o bloco try contém uma operação que pode gerar uma exceção de FileNotFoundException, que é lançada quando o arquivo especificado não é encontrado. O bloco catch trata a exceção de FileNotFoundException e imprime a mensagem "Erro: arquivo não encontrado." no console.

3. Exemplo de tratamento de exceção de entrada inválida:

Scanner scanner = new Scanner(System.in);
try {
    System.out.print("Digite um número inteiro: ");
    int numero = scanner.nextInt();
} catch (InputMismatchException e) {
    System.out.println("Erro: entrada inválida.");
}

Nesse exemplo, o bloco try contém uma operação que pode gerar uma exceção de InputMismatchException, que é lançada quando o usuário insere uma entrada inválida, como uma string em vez de um número inteiro. O bloco catch trata a exceção de InputMismatchException e imprime a mensagem "Erro: entrada inválida." no console.

4. Tratando duas exceções no mesmo bloco catch

Quando precisamos tratar duas exceções de tipos diferentes de forma semelhante, podemos capturá-las em um único bloco catch. Veja o exemplo abaixo:

try {
    // código que pode lançar as exceções
} catch (IOException | SQLException e) {
    // tratamento comum para as duas exceções
    logger.error("Erro ao processar dados: " + e.getMessage());
    // tratamento específico para a exceção IOException
    if (e instanceof IOException) {
        // ...
    }
    // tratamento específico para a exceção SQLException
    if (e instanceof SQLException) {
        // ...
    }
}

No exemplo acima, o bloco try contém o código que pode lançar as exceções IOException e SQLException. Em seguida, o bloco catch captura as duas exceções em um mesmo parâmetro (e) usando a sintaxe |. Dentro do bloco catch, realizamos um tratamento comum para ambas as exceções, e depois fazemos tratamentos específicos para cada uma delas usando as instruções if e o operador instanceof.

5. Tratando duas exceções em blocos catch separados

Quando precisamos tratar duas exceções de tipos diferentes de forma diferente, é melhor usar dois blocos catch separados. Veja o exemplo abaixo:

try {
    // código que pode lançar as exceções
} catch (IOException e) {
    // tratamento para a exceção IOException
    logger.error("Erro de entrada/saída: " + e.getMessage());
} catch (SQLException e) {
    // tratamento para a exceção SQLException
    logger.error("Erro de SQL: " + e.getMessage());
}

No exemplo acima, o bloco try contém o código que pode lançar as exceções IOException e SQLException. Em seguida, o primeiro bloco catch trata a exceção IOException, exibindo uma mensagem de erro no log. O segundo bloco catch trata a exceção SQLException, exibindo uma mensagem de erro diferente no log.

Usando dois blocos catch separados, podemos realizar um tratamento específico para cada exceção de forma clara e organizada. Isso torna o código mais fácil de ler e entender.

Conclusão

Tratar exceções em Java é uma parte essencial da programação que permite que você lide com erros e falhas em seu código de maneira eficaz. Usando blocos try-catch-finally, você pode garantir que seu programa continue funcionando mesmo quando ocorrer uma exceção. Lembre-se de ser específico sobre o tipo de exceção que você está tratando e use o bloco finally para executar o código que deve ser executado independentemente de ocorrer ou não uma exceção.

// Compartilhe esse Post

💫
🔥 NOVO APP

Domine o Inglês em 30 dias!

Inteligência Artificial + Repetição Espaçada • Método cientificamente comprovado

✅ Grátis para começar 🚀 Resultados rápidos
×