🚀 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
- Abra o arquivo
Usina.java. - 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:
| Entrada | Saí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:
| Temperatura | Comportamento Esperado |
|---|---|
| 500 | O programa roda sem erros. |
| 1500 | A 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:
- Verifique a estrutura: Certifique-se de que sua estrutura de pastas final está idêntica à mostrada abaixo.
- Abra o GitHub Desktop: Certifique-se de que o repositório do seu curso está selecionado no canto superior esquerdo.
- Visualize as alterações: Na aba Changes (à esquerda), você verá todos os arquivos que criou ou modificou nesta aula.
- 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).
- No campo Summary (na parte inferior esquerda), digite uma mensagem curta descrevendo o que fez, ex:
- 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.
- ⚠️ 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.
- 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!
- Copie o link do seu repositório no GitHub (ex:
💡 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();
}
}