Menu
Coddy logo textTech

Exceções Personalizadas

Parte da seção Programação Orientada a Objetos do Journey de Java da Coddy. Lição 60 de 87.

As exceções integradas do Java abrangem muitos cenários comuns de erro, mas às vezes você precisa de exceções específicas do domínio da sua aplicação. As Custom exceções permitem criar tipos de erro significativos que comunicam claramente o que deu errado.

Para criar uma exceção customizada, basta estender uma classe de exceção existente. Para uma exceção verificada, estenda Exception:

public class InsufficientFundsException extends Exception {
    public InsufficientFundsException(String message) {
        super(message);
    }
}

Para uma exceção não verificada, estenda RuntimeException:

public class InvalidAgeException extends RuntimeException {
    public InvalidAgeException(String message) {
        super(message);
    }
}

A chamada super(message) passa a mensagem de erro para a classe pai, tornando-a disponível por meio de getMessage(). Você pode então usar throw e catch com sua exceção custom, como qualquer outra:

public void withdraw(double amount) throws InsufficientFundsException {
    if (amount > balance) {
        throw new InsufficientFundsException("Balance too low: " + balance);
    }
    balance -= amount;
}

// Usando isso
try {
    account.withdraw(1000);
} catch (InsufficientFundsException e) {
    System.out.println(e.getMessage());
}

Exceções customizadas tornam seu código mais legível e permitem que os chamadores tratem condições de erro específicas de maneira diferente. Elas são especialmente valiosas ao criar APIs ou bibliotecas em que uma comunicação clara sobre erros é importante.

challenge icon

Desafio

Fácil

Vamos criar um sistema de reservas de ingressos que usa exceções custom para lidar com diferentes cenários de erro! Você criará tipos de exceção significativos que comunicam claramente o que deu errado ao reservar ingressos.

Você organizará seu código em quatro arquivos:

  • TicketSoldOutException.java: Create uma exceção checked custom (extends Exception) para quando os ingressos não estiverem mais disponíveis. Sua exceção deve aceitar uma mensagem em seu constructor e passá-la para a class pai usando super(message).
  • InvalidSeatException.java: Create uma exceção unchecked custom (extends RuntimeException) para quando alguém tentar reservar um número de assento inválido. Essa exceção também deve aceitar e passar uma mensagem para sua class pai.
  • TicketBooth.java: Create uma class que manages as vendas de ingressos. Seu booth deve acompanhar o número total de assentos available e o maior número de assento válido. Inclua:

    Um constructor que recebe o número total de assentos available.

    Um bookTicket(int seatNumber) method que valida a reserva. Se não houver ingressos restantes (os assentos available forem 0 ou menos), lance uma TicketSoldOutException com a mensagem "No tickets remaining". Se o número do assento for menor que 1 ou maior que o total de assentos, lance uma InvalidSeatException com a mensagem "Seat [seatNumber] does not exist". Otherwise, diminua os assentos available em 1 e imprima Booked seat [seatNumber] successfully.

    Um getAvailableSeats() method que retorna a contagem atual de assentos available.

  • Main.java: Reúna seu sistema de ingressos! Você receberá duas entradas: o número total de assentos e um número de assento para reservar.

    Create um TicketBooth com o total de assentos given. Em seguida, tente reservar o número de assento especificado dentro de um bloco try-catch. Como TicketSoldOutException é checked, você must lidar com ela. Capture TicketSoldOutException first e imprima Booking failed: [exception message]. Depois capture InvalidSeatException e imprima o mesmo formato: Booking failed: [exception message].

    After o bloco try-catch, imprima Remaining seats: [count] usando o method getter.

Você receberá duas entradas em ordem: total de assentos (int) e número do assento a reservar (int).

Observe como exceções checked obrigam os chamadores a lidar com elas (com try-catch ou throws), enquanto exceções unchecked não exigem tratamento explícito. Escolha o tipo de exceção com base no fato de o erro ser algo que os chamadores devem antecipar e do qual devem se recuperar!

Experimente você mesmo

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int totalSeats = scanner.nextInt();
        int seatNumber = scanner.nextInt();
        
        // TODO: Crie um TicketBooth com o total de assentos fornecido
        
        // TODO: Use um bloco try-catch para tentar reservar o assento
        // - Capture TicketSoldOutException primeiro e imprima "Booking failed: [exception message]"
        // - Capture InvalidSeatException e imprima "Booking failed: [exception message]"
        
        // TODO: After the try-catch, print "Remaining seats: [count]"
    }
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Programação Orientada a Objetos

Pratique por conta própria: Compilador de Java online