【发布时间】:2019-04-10 07:17:28
【问题描述】:
我运行 SonarQube 来检查我的代码,我发现了一个我不理解报告的错误的案例。
我的代码是:
private static final int BASE_ID = 100_000_000;
private boolean isValidId(Id id) {
return id.asInteger().isPresent() && id.asInteger().get() >= BASE_ID;
}
方法asInteger返回Optional<Integer>
我从 sonarqube 得到的错误是
Call "Optional#isPresent()" before accessing the value.
在返回线中。
我知道代码没问题,因为如果第一部分为 false,if 的第二部分将不会被执行。我知道这可以通过.filter(..).isPresent() 解决,但我更喜欢这种方式。
任何想法为什么会发生这种情况?
【问题讨论】:
-
我会说这只是因为那些代码检查工具并不总是完美地工作,并且一些错误只是误报。如果你改写成
if(...)肯定不会报错了 -
如果第二次调用
id.asInteger()会返回空Optional? -
return id.asInteger().orElse(-1) >= BASE_ID;呢?
标签: java java-8 sonarqube optional sonarqube-scan