Обработка нулевого указателя при использовании lamda - PullRequest
1 голос
/ 29 мая 2019

Будет ли приведенный ниже код когда-либо получать nullPointerException, если e.getKey() не вернет null

Map<Integer, Optional<SecurityAttributeChange>> spnCreationDetails;
Optional.ofNullable(spnCreationDetails.get(e.getKey()).orElse(new SecurityAttributeChange()).getNewAttribute())
                                    .orElse(new SecurityAttr())
                                    .getUserName());

Я получаю NPE в этой строке, есть ли способ отладить это?Я знаю, spnCreationDetails.get(e.getKey()) возвращает ноль, я что-то упускаю при обработке null здесь?


- РЕДАКТИРОВАТЬ


Вот почтиЗавершить метод, который поможет дать информацию о том, как реорганизовать это так, чтобы он был читабельным.

private void updateAuditFields(List<SecurityAttributeChange> securityChanges, Map<Integer, Map<String, Object>> result) {

    Map<Integer, Optional<SecurityAttributeChange>> spnModificationDetails = ...

    Map<Integer, Optional<SecurityAttributeChange>> spnCreationDetails = ...

    result.entrySet().stream().forEach(e -> {
        e.getValue()
                .put("userIdLastChanged",
                        Optional.ofNullable(Optional.ofNullable(spnModificationDetails.get(e.getKey()))
                                .orElse(Optional.of(new SecurityAttributeChange()))
                                .get()
                                .getNewAttribute()).orElse(new SecurityAttr()).getUserName());

        e.getValue()
                .put("lastChangedDatetime",
                        Optional.ofNullable(Optional.ofNullable(spnModificationDetails.get(e.getKey()))
                                .orElse(Optional.of(new SecurityAttributeChange()))
                                .get()
                                .getNewAttribute()).orElse(new SecurityAttr()).getKnowledgeBeginDate());

        e.getValue()
                .put("userIdCreated", Optional.ofNullable(
                        Optional.ofNullable(spnCreationDetails.get(e.getKey())).orElse(Optional.of(new SecurityAttributeChange())).get().getNewAttribute())
                        .orElse(new SecurityAttr())
                        .getUserName());

        e.getValue()
                .put("createdDatetime",
                        Optional.ofNullable(Optional.ofNullable(spnCreationDetails.get(e.getKey()))
                                .orElse(Optional.of(new SecurityAttributeChange()))
                                .get()
                                .getNewAttribute()).orElse(new SecurityAttr()).getKnowledgeBeginDate());

    });
}

1 Ответ

5 голосов
/ 29 мая 2019

Если spnCreationDetails.get(e.getKey()) может быть нулевым, вам, вероятно, понадобится:

Optional.ofNullable(spnCreationDetails.get(e.getKey()))
        .orElse(new SecurityAttributeChange())
        .getNewAttribute()
        .orElse(new SecurityAttr())
        .getUserName();

т.е. spnCreationDetails.get(e.getKey()) следует обернуть Optional.

РЕДАКТИРОВАТЬ: увидев ваш комментарий, spnCreationDetails.get(e.getKey()) может вернуть либо null, либо Optional<SecurityAttributeChange>, поэтому было бы лучше преобразовать только null в новый Optional:

spnCreationDetails.getOrDefault(e.getKey(),Optional.empty())
                  .orElse(new SecurityAttributeChange())
                  .getNewAttribute()
                  .orElse(new SecurityAttr())
                  .getUserName();            
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...