Spring Boot 确保此“可选”永远不能为空,并删除此空检查

2mbi3lxu  于 2023-03-02  发布在  Spring
关注(0)|答案(3)|浏览(142)

我正在使用Spring boot并使用sonarqube分析我的代码,见下面一行

Optional<Animal> animal = animalRepository.findById(animalId);
if (animal == null) {
            throw new DeviceNotValidException("Failed to found animal detail",  new String[] { animalId});
        }

我得到这个错误
确保此"Optional"永远不能为空,并删除此空检查。
根据我的理解,"Optional通常用作方法的返回类型,这些方法可能并不总是返回结果。"
我想确保即使"findById()"返回null,也不会出现null指针异常,所以我在这里使用了"Optional"。
我可以做些什么来改进我的代码,使错误消失吗?
我读了这个Checking whether an Optional object isn't Empty and null,但没有帮助。

f0ofjuux

f0ofjuux1#

可选的应用是减少空值。
检查提供的可选项是否为null并不足以让编译器确定其值不为null。
要检查可选值,请使用optional.isEmpty();optional.isPresent();
在您的情况下:检查存储库的响应,如下所示:

Optional<Animal> animal = animalRepository.findById(animalId);
if (animal.isEmpty()) {
            throw new DeviceNotValidException("...");
}

或者更简单:

Animal animal = animalRepository.findById(animalId)
                      .orElseThrow(() -> new DeviceNotValidException("...");

最后一种方法确保animal不为空。

1cosmwyk

1cosmwyk2#

if (animal == null)不符合您所需的行为。虽然Optional的内容可以为null,但Optional本身是一个 Package 器,不应为null。
将该行改为:if (!animal.isPresent()).

0ejtzxu1

0ejtzxu13#

由于您使用的是Spring Data,因此您遇到的问题是检查Optional是否为null,其中所说的Optional是为了减少空检查。
Z-100建议的正确用法是使用orElseThrow

Animal animal = animalRepository.findById(animalId)
                      .orElseThrow(() -> new DeviceNotValidException("...");

但由于您使用的是Spring Data,因此也可以使用getReferenceById:

Animal animal = animalRepository.getReferenceById(animalId);

它通常会抛出一个EntityNotFoundException

相关问题