SonarQube 8.1.0 在访问值之前抱怨调用“Optional#isPresent()”

Posted

技术标签:

【中文标题】SonarQube 8.1.0 在访问值之前抱怨调用“Optional#isPresent()”【英文标题】:SonarQube 8.1.0 is complaining about Call "Optional#isPresent()" before accessing the value 【发布时间】:2020-04-17 12:44:09 【问题描述】:

我收到错误消息:“在访问值之前调用“Optional#isPresent()””

但正如您在图片中看到的那样,在该行之前有一个 isPresent() 检查。

这是 SonarQube 的错误吗?

-

【问题讨论】:

@amer Optional 没有 getId() 方法。 严格来说,当您调用component.getId() 第二次 时,您不能假设它会给出与您调用isPresent() 相同的Optional 实例.我无法检查这是否解决了它,因为我的并没有提出问题 如果@ernest_k 的陈述成立,应该可以通过提取一些Optional<String> id = component.getId(); 来预防 @amer 如果您想要一个替代值,那么可以。但是,如果您想要分支控制流,那么这是不可能的。 另一方面,在类中定义 Optional 类型属性是一种不好的做法。我想知道 getId 是否只是一个吸气剂,为什么 Sonar 也不会警告你。 【参考方案1】:

ernest_k 是对的:(谢谢!)

严格来说,当你第二次调用 component.getId() 时间,你不能假设它会给出相同的 Optional 实例 你打电话给 isPresent() 。

所以我把代码改成:

Optional<String> optionalId = component.getId();
if (optionalId.isPresent()) 
     String id = optionalId.get();
     // ...

【讨论】:

以上是关于SonarQube 8.1.0 在访问值之前抱怨调用“Optional#isPresent()”的主要内容,如果未能解决你的问题,请参考以下文章

SonarQube 插件权限质量配置

Sonarqube 与现有 Oracle 12c 的集成

SonarQube 是不是支持 JSONP?

Sonarqube - 避免捕获通用异常

声纳抱怨记录或重新抛出异常

SonarQube服务启动,运行然后停止?