Обычно настраиваемые исключения должны определяться на верхнем уровне. Поскольку, почти повсеместно, эти исключения являются частью интерфейса пакета или модуля.
Если пользователь их не видит, то как они собираются перехватить их отдельно? И если вы не хотите отлавливать их отдельно, тогда зачем вам нужны отдельные классы?
Однако, если вам нужно, вы можете включить их в класс, для которого они требуются:
public class SeatReservationSystem {
public static class ReservationFailedException {
... constructors taking a message ...
}
public static class SeatTakenException extends ReservationFailedException {
... constructors taking a message ...
}
public static class OutsideAgeException extends ReservationFailedException {
... constructors taking a message ...
}
....
}
После этого вы можете создать любой метод, который возвращает по мере необходимости. Не создавайте методы, которые бросают их, поскольку компилятор не будет рассматривать их как точки выхода блока, в котором вы находитесь, и вы получите странные ситуации.
Вот некоторые код, показывающий, что я имею в виду:
// wrong
public static void throwRuntimeException() throws RuntimeException {
throw new RuntimeException();
}
// correct, but dangerous
public static RuntimeException createRuntimeException() {
return new RuntimeException();
}
public static void main(String[] args) {
String initializeMeOrThrowException;
if (new Random().nextBoolean()) {
// compiler doesn't recognize that the method always throws an exception
throwRuntimeException();
// this the compiler can understand, there is an explicit throw here:
// throw createRuntimeException();
// but this is the pitfall, it doesn't do anything:
// createRuntimeException();
} else {
initializeMeOrThrowException = "Initialized!";
}
// Compiler error for throwRuntimeException and createRuntimeException without throws:
// "The local variable initializeMeOrThrowException may not have been initialized"
System.out.println(initializeMeOrThrowException);
}
Однако опыт показывает, что я забыл выражение throws
для метода throw createException(...);
, и тупой компилятор не предупреждает меня об этом (хотя без него утверждение совершенно бесполезно). Поэтому я стараюсь и не использовать.
Обратите внимание, что я не уверен, следует ли вам использовать исключения для этого. Если ваша система является системой бронирования, то отказ от билетов не является исключительным . Возвращение ReservationResult
имеет больше смысла.