SonarQube无法理解用于null检查的Java内联表达式

时间:2017-12-06 10:54:23

标签: java sonarqube

我们正在使用SonarQube进行静态代码分析。 我们正面临SonarQube发现的以下Bug:

NullPointerException might be thrown as 'evt' is nullable here

以下代码

try {
//business logic

}(Exception e){
    throw new MyException("Found issue for event " + evt.getDeatil());
}

因此,为了消除此错误,我们引入了用于空检查的小型内联代码

try {
//business logic

 }(Exception e){
     throw new MyException("Found issue for event " + evt != null ?
       evt.getDeatil() : null);
}

仍然SonarQube在代码更改后显示相同的违规错误。

有人可以帮助我们找到我们在这里缺少的东西吗?

1 个答案:

答案 0 :(得分:2)

你有一个错误:

dt <- "2009-12-03"
dt <-as.POSIXct(ymd_hms(paste(dt, c(" 00:00:00"))), tz="UTC", format("%Y-%m-%d %H:%M:%OS"))
dt
[1] NA NA

问题是operators precedence。在throw new MyException("Found issue for event " + evt != null ? evt.getDeatil() : null); 之前评估+,因此您的代码等于:

?:

仍然可以发生NullPointerException。另外你引入了一个新问题 - 表达式:

String message = "Found issue for event " + evt;
throw new MyException(message != null ? evt.getDeatil() : null);

始终评估为message != null

要解决此问题,您必须添加大括号:

true