Я бы определенно заставил метод генерировать исключение, если он не может рассчитать правильный ответ.
Теперь вам нужно решить, будет ли выброшенное исключение проверено или снято.Это действительно зависит от контекста.Обычно я думаю так: если у вызывающей стороны есть способ убедиться, что метод не может завершиться с ошибкой, я бы заставил его вызвать исключение без проверки;в противном случае, если у вызывающей стороны нет никакой возможности быть абсолютно уверенной в том, что метод не потерпит неудачу, тогда я бы сделал это проверенным исключением.
В этом случае вызывающая сторона может определить вероятность ошибки:
class C1 {
public boolean canCalculateResultNow() { ... }
public boolean calculateResult() {
if (cannot get resource) throw new IllegalStateException("Cannot get resource");
...
}
}
Теперь вот что я сделаю, если вызывающая сторона не может быть уверена, что метод сможет нормально завершиться:
class CannotCalculateResultException extends Exception { ... }
class C2 {
public boolean calculateResult() throws CannotCalculateResultException {
if (cannot calculate result) throw new CannotCalculateResultException();
...
}
}
Еще одна возможность, которая мне действительно не нравится иНастоятельно не рекомендуется, чтобы метод возвращал Boolean
, который является обнуляемой версией boolean
.A Boolean
может быть true
, false
или null
.Затем вы можете заставить метод возвращать null
, если ресурс недоступен.
Основная проблема, которую я вижу в этом подходе, заключается в том, что значение null
может быть неясным.Вызывающий код всегда должен проверять, является ли результат нулевым, и разработчику (возможно, даже вам самим через несколько месяцев после написания этого кода) придется прочитать документацию метода, чтобы узнать, что означает нулевой результат.Конкретное проверенное исключение дает понять, что что-то может пойти не так, а что - нет.Кроме того, это заставило бы разработчика подготовиться к делу, в котором что-то пошло не так.При подходе с непроверенными исключениями наличие метода canCalculateResult()
также будет указывать разработчику, использующему класс, что что-то может пойти не так, без необходимости читать документацию, и разумно предположить, что это что-то «опасное»."звонить calculareResult()
без первого звонка canCalculateResult()
.