Метод возврата Lambda, который вызывает метод, который генерирует исключение

#java #exception #methods #return #throw

#java #исключение #методы #Возврат #бросать

Вопрос:

У меня следующая проблема. Я работаю в method 1 и это method 1 должно возвращать объект определенного класса. Для моего оператора return я вызываю другой method 2 (который, конечно, возвращает объект указанного класса). Хотя этот другой method 2 генерирует исключение. Как я должен написать свой оператор return в моем исходном 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;
    }
}
  

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

Комментарии:

1. привет. похоже, что код, который вы написали в своем вопросе, неправильно отформатирован java. Полезно, если ваш код хотя бы близок к работоспособному (например, вам не нужно заглушки во всех методах, но, по крайней мере, сделать это возможным для других, чтобы сделать это без особых усилий)

2. Вызов method2 может завершиться успешно и может выдать исключение, но в любом случае он выполнит то, что происходит после блоков try и catch, то есть вернет null. Вы можете изменить его по своему усмотрению. У меня нет всего вашего кода, поэтому я не могу знать, что вы хотите там сделать. Предоставьте нам больше информации, чтобы мы могли помочь вам в дальнейшем.

3. Привет, я обновил свой пост. Спасибо за совет. В принципе, обычно исключение никогда не должно создаваться. Я всегда должен получать этот объект из method2. Я полагаю, что в случае, если исключение все еще генерируется, я должен поместить возвращаемое значение null в мои catch-скобки?

Ответ №1:

Редактировать. Вы написали

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

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

На ваш стандартный поток кода это не повлияет, и вы избежите возврата null значения.


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

введите описание изображения здесь

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

  • Обработайте 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 , используйте пользовательские.

Комментарии:

1. Привет, спасибо за ваш очень полезный ответ. Это многое объясняет. Обычно это исключение никогда не должно возникать, поэтому у меня на самом деле нет никакого варианта его использования, или я на самом деле не написал код на случай, если оно выдается. Что вы подразумеваете под ‘сигнализирует об ошибке, которая должна быть очевидна для вас. Итак, позвольте ему всплыть.?’ Что вы подразумеваете под ‘сигнализирует об ошибке?’ и ‘Позволить ему всплыть’? В противном случае я просто использую то, что вы мне дали, и создам свой собственный класс исключений, который реализует RuntimeException.

2. @SimonartM Я имею в виду, что это поведение не то, что вы ожидаете, и вы, по-видимому, не можете восстановиться после этого. «Позволить ему всплыть» означает, что ваше приложение в основном завершается сбоем. Для вас это нормально? Или вы хотите восстановиться после подобной ошибки? (Я бы не стал)