🚀 Capítulo 13: Tratamento de Exceções

🎯 Objetivo da Aula

Ao final desta aula, você será capaz de compreender o conceito de Exceções em Java, utilizando os blocos try-catch-finally para capturar erros em tempo de execução e evitar que o programa pare de funcionar inesperadamente.


🏢 O Cenário Prático (Seu Desafio)

Você foi contratado como engenheiro de software na Usina Nuclear de Springfield. O operador do console é o Homer Simpson. O seu desafio é criar um programa que monitore os sistemas. Como Homer costuma digitar valores errados ou fazer operações impossíveis, você deve tratar esses erros (Exceções) para evitar um derretimento do núcleo!


🧠 Fundamentos: A Teoria Traduzida

Na programação, erros acontecem. Um usuário pode digitar um texto onde deveria ser um número, ou o sistema pode tentar dividir um número por zero. Em Java, esses erros de execução são chamados de Exceções.

  • try (Tentar): É o bloco onde você coloca o código que pode dar erro.
  • catch (Capturar): É o bloco que executa se o erro acontecer. É o seu plano de emergência.
  • finally (Finalmente): É o bloco que executa sempre, dando erro ou não. Use para fechar recursos (como desligar o alarme ou fechar o scanner).

Fluxo de Exceção

flowchart TD
    A["Início do `try`"] --> B{"Ocorreu Erro?"}
    B -- Sim --> C["Desvia para o `catch`"]
    B -- Não --> D["Termina o `try`"]
    C --> E["Executa o `finally`"]
    D --> E
    E --> F["Continua o programa"]

📖 Exemplo Guiado

Vamos simular o cálculo de divisão de barras de urânio. Se dividirmos por zero (porque Homer esqueceu de preencher), o Java gera uma ArithmeticException.

public class Usina {
    public static void main(String[] args) {
        int uranio = 100;
        int operadores = 0; // Homer colocou zero no painel!
 
        try {
            System.out.println("Tentando dividir o urânio...");
            int resultado = uranio / operadores;
            System.out.println("Cada operador recebe: " + resultado);
        } catch (ArithmeticException e) {
            System.out.println("🚨 ALERTA! Erro: Divisão por zero não permitida!");
            System.out.println("Acionando protocolo de segurança!");
        } finally {
            System.out.println("Sistema de resfriamento continua ativo.");
        }
        
        System.out.println("Programa continua rodando normalmente.");
    }
}

🕹️ Como Executar e Testar no VS Code

  1. Abra o arquivo Usina.java.
  2. Clique em Run logo acima do método main.

Resultado Esperado:

Tentando dividir o urânio...
🚨 ALERTA! Erro: Divisão por zero não permitida!
Acionando protocolo de segurança!
Sistema de resfriamento continua ativo.
Programa continua rodando normalmente.


🛠️ Prática Obrigatória 1

Crie um programa chamado LeituraTeclado.java. O programa deve tentar ler um número inteiro do teclado usando o Scanner. Se o usuário digitar um texto (como “Doh!”), o Java gerará uma InputMismatchException. Use o try-catch para capturar esse erro e exibir a mensagem: ”🚨 Erro: Você deve digitar um número inteiro!“.

Resultado Esperado:

EntradaSaída Esperada
10(O programa continua normalmente)
“Doh!”🚨 Erro: Você deve digitar um número inteiro!

🛠️ Prática Obrigatória 2

Crie uma exceção personalizada chamada MeltdownException (ela deve herdar de Exception). Crie um método void verificarTemperatura(int temp) que lança essa exceção (usando o comando throw) se a temperatura for maior que 1000 graus. Teste o método em um bloco try-catch.

Resultado Esperado:

TemperaturaComportamento Esperado
500O programa roda sem erros.
1500A exceção MeltdownException é lançada e tratada.

📤 Instruções de Entrega (GitHub Desktop + Microsoft Teams)

Neste curso, você entregará suas atividades enviando o código para o seu repositório no GitHub usando o aplicativo GitHub Desktop. Siga o passo a passo detalhado:

  1. Verifique a estrutura: Certifique-se de que sua estrutura de pastas final está idêntica à mostrada abaixo.
  2. Abra o GitHub Desktop: Certifique-se de que o repositório do seu curso está selecionado no canto superior esquerdo.
  3. Visualize as alterações: Na aba Changes (à esquerda), você verá todos os arquivos que criou ou modificou nesta aula.
  4. Faça o Commit:
    • No campo Summary (na parte inferior esquerda), digite uma mensagem curta descrevendo o que fez, ex: Finaliza atividades do Capítulo 13.
    • Clique no botão azul Commit to main (ou o nome da sua branch).
  5. Envie para a Nuvem (Push): No topo da tela, clique no botão Push origin. Isso enviará seu código do seu computador para o seu perfil no GitHub.
  6. ⚠️ IMPORTANTE (Repositório Público): Para que o professor consiga corrigir, o seu repositório no GitHub DEVE SER PÚBLICO. Repositórios privados não podem ser visualizados por quem não foi convidado.
  7. Como entregar no Microsoft Teams:
    • Copie o link do seu repositório no GitHub (ex: https://github.com/seu-usuario/seu-repositorio).
    • Abra a tarefa correspondente no Microsoft Teams.
    • Clique no botão Adicionar trabalho (ou Add work).
    • Selecione a opção Link no menu lateral.
    • Cole o link do GitHub no campo “Endereço Web” e digite um texto (ex: Meu Repositório) no campo “Texto a ser exibido”.
    • Clique em Anexar.
    • MUITO IMPORTANTE: Clique no botão Entregar (ou Turn in) no canto superior direito para concluir o envio!

💡 Checkpoint de Lógica

O que você acabou de fazer é tornar seu software Robusto. Um bom programador não apenas escreve o código que funciona, mas também prevê todas as formas possíveis que o sistema pode falhar e cria proteções para isso!


🔥 Desafio de Fixação (Opcional)

Faça o programa da Prática 1 continuar pedindo o número em um laço de repetição até que o usuário digite um valor numérico válido.


🔑 Gabarito de Código/Fórmulas

Prática 1:

import java.util.Scanner;
import java.util.InputMismatchException;
 
public class LeituraTeclado {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        try {
            System.out.print("Digite a temperatura: ");
            int temp = sc.nextInt();
            System.out.println("Temperatura registrada: " + temp);
        } catch (InputMismatchException e) {
            System.out.println("🚨 Erro: Você deve digitar um número inteiro!");
        } finally {
            sc.close();
        }
    }
}

Prática 2:

// Exceção Personalizada
public class MeltdownException extends Exception {
    public MeltdownException(String mensagem) {
        super(mensagem);
    }
}
 
// Classe de Monitoramento
public class Monitor {
    public static void verificarTemperatura(int temp) throws MeltdownException {
        if (temp > 1000) {
            throw new MeltdownException("Núcleo superaquecido! Perigo de Meltdown!");
        }
    }
 
    public static void main(String[] args) {
        try {
            verificarTemperatura(1200);
        } catch (MeltdownException e) {
            System.out.println("🚨 ALERTA: " + e.getMessage());
        }
    }
}

Desafio:

import java.util.Scanner;
import java.util.InputMismatchException;
 
public class LeituraInfinita {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        boolean sucesso = false;
        
        while (!sucesso) {
            try {
                System.out.print("Digite um número: ");
                int num = sc.nextInt();
                System.out.println("Você digitou: " + num);
                sucesso = true; // Para o loop
            } catch (InputMismatchException e) {
                System.out.println("🚨 Erro: Digite apenas números!");
                sc.nextLine(); // Limpa o buffer do scanner
            }
        }
        sc.close();
    }
}

Capitulo Anterior | Proximo Capitulo