Могу ли я определить несколько пользовательских исключений в java в одном файле класса и вызвать их с помощью методов? - PullRequest
1 голос
/ 13 февраля 2020

Я пытаюсь перейти к обработке исключений с помощью пользовательских исключений.

Я создаю класс CustomExceptions и расширяю Exception следующим образом:

public class CustomExceptions extends Exception{
    public CustomExceptions (String s) {
        super(s);
    }

Однако вместо того, чтобы Создавая несколько файлов для каждого пользовательского исключения, которое я хочу, или раздувая файл основного класса, я хотел бы поместить все свои пользовательские исключения в этот класс и вызывать их с помощью метода

Итак, допустим, что я хочу обрабатывать 2 ситуации: когда пользователь пытается ввести бронирование места, но место уже занято, и когда пользователь пытается предоставить билет кому-то за пределами возрастного диапазона.

Могу ли я создать 2 метода внутри класса CustomExceptions, который вызывает конструктор, передавая ему настраиваемое сообщение?

    public void seatTaken(String s) {
        String s = "The seat is taken, please choose a new one";
        CustomExceptions(s);

    }

    public void notOldEnough(String s) {
      String s = "User is not old enough for this movie.";
      CustomExceptions(s)

    }
}

Будет ли это работать? Или я вынужден создать несколько пользовательских файлов исключений?

1 Ответ

2 голосов
/ 13 февраля 2020

Обычно настраиваемые исключения должны определяться на верхнем уровне. Поскольку, почти повсеместно, эти исключения являются частью интерфейса пакета или модуля.

Если пользователь их не видит, то как они собираются перехватить их отдельно? И если вы не хотите отлавливать их отдельно, тогда зачем вам нужны отдельные классы?

Однако, если вам нужно, вы можете включить их в класс, для которого они требуются:

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 имеет больше смысла.

...