Как передать метод из класса исключений в конструктор исключений? - PullRequest
0 голосов
/ 16 февраля 2019

Я написал класс, который должен моделировать автомобиль и топливную систему, когда машина проезжает определенное расстояние, я пытаюсь вызвать «OutOfFuelException», и при этом я хотел бы передать методиз класса OutOfFuelException в вызов конструктора, но я не уверен, как это сделать без фактического создания экземпляра класса.

Вот код для класса исключения:

public class OutOfFuelException extends Exception {
    private double fuelNeeded;

    public OutOfFuelException (double fuelNeeded) {
        super("You need fuel!");
        this.fuelNeeded = fuelNeeded;
    }

    public double getShortfall() {
        return fuelNeeded;
    }
}

А вот попытка использования вызова метода:

if (miles > getRange()) {
            fuel = 0;
            throw new OutOfFuelException(getShortfall());
        }

Ответы [ 2 ]

0 голосов
/ 16 февраля 2019

Давайте сделаем это просто: все, что вам нужно сделать, это передать двойной параметр конструктора Exception в параметр супер-конструктора, вот и все.

Исключение не должно действительно содержать состояние, а скорее используется в основном для сообщения об ошибке, где это необходимо.Таким образом, fulelNeeded должен быть передан в конструктор супер, чтобы трассировка стека отображала это значение.Например:

super("You need fuel: " + fuelNeeded);

все проще, чем как вы его проводите:

public class OutOfFuelException extends Exception {

    public OutOfFuelException (double fuelNeeded) {
        super("Fuel shortfall: " + fuelNeeded);
    }
}

Так что это должно работать:

if (miles > getRange()) {
    fuel = 0;
    throw new OutOfFuelException(getShortfall());
}

или, возможно,проще:

if (miles > getRange()) {
    fuel = 0;
    throw new OutOfFuelException(miles - getRange());
}
0 голосов
/ 16 февраля 2019

Ваш Exception класс может принять Функциональный интерфейс.

public class OutOfFuelException extends Exception {
   public OutOfFuelException(final Supplier<String> valueSupplier) {
      super(valueSupplier.get());
   }  

   ...
}

В этом случае вы можете передать конструктору ссылку на метод, который не принимает параметры и которыйверните String значение или соответствующее лямбда выражение.

public void myMethod() throws OutOfFuelException {
   ...

   if (miles > getRange()) {
      throw new TestException(this::buildValue);
   }
}

public String buildValue() {
    return "My value";
}

Настройте для своих нужд, но, пожалуйста, не делайте этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...