Лямбда-метод возврата, который вызывает метод, который вызывает исключение - PullRequest
1 голос
/ 15 марта 2019

У меня следующая проблема. Я работаю в пределах method 1, и этот method 1 должен возвращать объект определенного класса. Для моего оператора return я вызываю другой method 2 (который, конечно, возвращает объект указанного класса). Хотя этот другой method 2 вызывает исключение. Как мне написать заявление о возврате в моем начальном method 1?

Как это?

public class testClass {

    public testClass() {
    }

    public <T> T method1(parameter1, ...) {

     if(parameter1) {
      return () -> {
       try {
        method2(parameter1, parameter2...);
       } 
       catch (CloneNotSupportedException ex) {
        System.err.print("Error while cloning programmer");
       }
      };
    } else {
    return null;
    }
}

Но я думаю, что если я сделаю это, он вернет только ноль? Должен ли я поставить нулевой возврат после последней скобки? Или я должен написать это совершенно по-другому?

1 Ответ

4 голосов
/ 15 марта 2019

Изменить.Вы написали

Как правило, исключение никогда не должно создаваться

Это идеальный вариант использования для RuntimeException.Это в основном прозрачное исключение.Пользователи вашего кода не увидят его, но он будет выглядеть как дикий покемон, когда произойдет что-то необычное, и остановит ваше приложение, давая вам возможность исправить это.

Ваш стандартный кодпоток не будет затронут, и вы не будете возвращать значение null.


Лямбда выражениям не разрешено выбрасывать отмеченные Exception с.
CloneNotSupportedException extends Exception.

enter image description here

Теперь у вас есть два варианта

  • Обрабатывать Exceptionна месте, как вы это сделали
  • Распространите Exception, завернув его в RuntimeException

return () -> {
    try {
       method2(parameter1, parameter2...);
    } catch (final CloneNotSupportedException e) {
       throw YourCustomRuntimeException("Error while cloning", e /* Original cause */);
    }
};

Это зависит от варианта использования, но я думаю,CloneNotSupportedException сигнализирует об ошибке , которая должна быть очевидна для вас, разработчик.Так что пусть это всплывет.

Пользовательский Exception просто нужно расширить RuntimeException и, возможно, предоставить дополнительные поля для хранения соответствующих данных.

YourCustomRuntimeException extends RuntimeException { ... }

Не бросить базу RuntimeException, использовать пользовательские.

...