Médio Java

Validação de idade com exceção personalizada

Enunciado

Crie uma exceção personalizada IdadeInvalidaException (checked) que represente idade fora do intervalo permitido (0 a 150). Escreva um método validarIdade(int idade) que lance essa exceção se a idade for inválida. No main, leia uma idade e trate a exceção, exibindo a mensagem de erro.

Requisitos

  • A exceção IdadeInvalidaException deve ser checked (herdar de Exception).
  • O método validarIdade deve declarar throws IdadeInvalidaException.
  • Se a idade for inválida, exiba Idade inválida: X (onde X é a idade).
  • Se a idade for válida, exiba Idade válida: X.

Código inicial

import java.util.Scanner;

// Defina a exceção personalizada aqui

public class ValidaIdade {
    public static void validarIdade(int idade) /* throws ... */ {
        // TODO: lance exceção se idade < 0 ou > 150
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int idade = sc.nextInt();
        // TODO: chame validarIdade e trate a exceção
        sc.close();
    }
}

Saída esperada

Idade válida: 25
Idade inválida: -5
Ver dica

A exceção personalizada deve ter um construtor que receba uma mensagem e chame super(mensagem). No main, use try/catch para capturar IdadeInvalidaException.

Mostrar solução
import java.util.Scanner;

class IdadeInvalidaException extends Exception {
    public IdadeInvalidaException(String mensagem) {
        super(mensagem);
    }
}

public class ValidaIdade {
    public static void validarIdade(int idade) throws IdadeInvalidaException {
        if (idade < 0 || idade > 150) {
            throw new IdadeInvalidaException("Idade inválida: " + idade);
        }
        System.out.println("Idade válida: " + idade);
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int idade = sc.nextInt();
        try {
            validarIdade(idade);
        } catch (IdadeInvalidaException e) {
            System.out.println(e.getMessage());
        }
        sc.close();
    }
}

Passo a passo

  1. Definimos IdadeInvalidaException estendendo Exception (checked).
  2. O construtor recebe uma mensagem e a repassa para super.
  3. O método validarIdade declara throws IdadeInvalidaException.
  4. Se a idade estiver fora do intervalo, throw lança a exceção com a mensagem.
  5. Se a idade for válida, imprime a mensagem de sucesso.
  6. No main, lemos a idade e chamamos validarIdade dentro de um try.
  7. O catch captura a exceção e imprime a mensagem.
  8. Fechamos o Scanner.

Por que funciona

Como IdadeInvalidaException é checked, o compilador exige que ela seja tratada ou declarada. O throws na assinatura do método informa que ele pode lançar essa exceção, e o try/catch no main a trata. Isso garante que o programa não termine abruptamente e que o erro seja comunicado de forma clara.

Erros comuns

  • Esquecer de declarar throws: o código não compila, pois a exceção checked não é tratada.
  • Estender RuntimeException: a exceção se torna unchecked e o compilador não exige tratamento, o que pode não ser o desejado.
  • Não chamar super(mensagem): a mensagem não será armazenada e getMessage() retornará null.

Outra forma de resolver

Você pode usar uma exceção unchecked (estendendo RuntimeException) se quiser evitar a obrigatoriedade de tratamento. No entanto, para validação de dados, checked é mais apropriada.

Saída esperada

Idade válida: 25
Idade inválida: -5