我正在使用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,但没有帮助。
3条答案
按热度按时间f0ofjuux1#
可选的应用是减少空值。
检查提供的可选项是否为null并不足以让编译器确定其值不为null。
要检查可选值,请使用
optional.isEmpty();
或optional.isPresent();
。在您的情况下:检查存储库的响应,如下所示:
或者更简单:
最后一种方法确保
animal
不为空。1cosmwyk2#
行
if (animal == null)
不符合您所需的行为。虽然Optional的内容可以为null,但Optional本身是一个 Package 器,不应为null。将该行改为:
if (!animal.isPresent())
.0ejtzxu13#
由于您使用的是Spring Data,因此您遇到的问题是检查
Optional
是否为null
,其中所说的Optional
是为了减少空检查。Z-100建议的正确用法是使用
orElseThrow
:但由于您使用的是Spring Data,因此也可以使用getReferenceById:
它通常会抛出一个
EntityNotFoundException
。