Как устранить исключение нулевого указателя в приложении, позволив приложению продолжить выполнение задачи без слишком большого количества проверок нуля с помощью Spring - PullRequest
0 голосов
/ 01 апреля 2020

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

record.getFoos().forEach(foo -> foo.setBar("Bar!")); //record.getFoos() might be null

Опция 1:

if(record.getFoos() !=null){
} else {
// set default value
}

Опция 2:

Optional.ofNullable(record.getFoos()).ifPresent(foo -> foo.setBar("Bar!")).orElse(new Bar("Default"));

Вариант 3:

Используйте десериализатор клиента при сопоставлении JSON с объектами POJO, чтобы убедиться, что ни одно из обязательных свойств не равно нулю, и замените его на значение по умолчанию.

Без комментариев по поводу Опция 1 , так как это худший вариант, когда речь идет о количестве кода, который нам нужно написать.

Я думаю, вы можете подумать, что в option 2 нет ничего плохого, но проблема в том, что там будет слишком много мест и что ни одно из обязательных свойств не будет нулевым. Это не будет действительно масштабируемым, если вы имеете дело с тысячами свойств и тоннами перестановок.

Опция 3 также кажется приемлемой, но она очищается от ошибок и не масштабируется так как нам нужно убедиться, что для любого нового свойства обновляется десериализатор, и это легко может выйти из-под контроля c.

Мне было интересно, есть ли другой способ в Spring Framework, где мы можем как-то определить подход что всякий раз, когда исключение нулевого указателя генерируется в определенном пакете, тогда вместо выхода из метода продолжить работу и использовать значение по умолчанию для соответствующего объекта? В этом случае нам просто нужно сказать, что значением по умолчанию для Bar является "Default".

1 Ответ

2 голосов
/ 01 апреля 2020

Я думаю, что стоит упомянуть несколько лучших практик, которые обычно используются, чтобы избежать подобных проблем:

  • Как указывает @chrylis -on strike-, вам действительно следует избегать использования null коллекции. В этом случае всегда используйте пустые коллекции .
  • Также не добавляйте элементы null в коллекцию. Редко есть веская причина, чтобы сделать это честно.
  • Если нулевые элементы являются просто частью временного состояния, вы можете легко отфильтровать нулевые значения:
record.getFoos().stream()
    .filter(Objects::nonNull)
    .forEach(it -> . . .)

  • Optional.ofNullable(. . .).orElse(. . .) - это обычно хороший способ обработать что-то и вместо этого дать значение по умолчанию. Вы можете легко создать служебный метод для обработки этого в масштабе. Например,
public static  <T> T defaultIfNull(T nullable, T defaultVal) {
    return Optional.ofNullable(nullable).orElse(defaultVal);
}
  • Никогда не пытайтесь кататься NullPointerException и пытаться справиться с этим. Это скользкая дорога, которая ведет в ад:)
  • Если вы десериализуете обнуляемую сущность и у вас есть значение по умолчанию, имеющее этот код:
public class JavaObject 
{
   @JsonProperty("some-value")
   public String someValue = "default-value"; // set default value

   @JsonSetter("some-value")
   public void setSomeValue(String s) {
    if (s != null) { // check for null assingment
        someValue = s; 
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...