对于我在我的一个测试类中的下面一段代码,Sonar抛出了一个严重的违规行为 - 正确性 - 以前取消引用的Nullcheck值
if (testLst != null && !testLst.isEmpty()) {
for (Test test : testLst) {
if (test.getName().equalsIgnoreCase("TEST")) {
// do blah
}
如果有人在这里做错了,可否有人对此有所了解?
编辑:这里的答案之一建议这是因为我之前可以访问变量,因此空检查是多余的。但事实并非如此。这是我的空检查之前的代码行。 testLst = myTest.getValues(); //I am basically populating the array by doing a get, but I am not accessing the list itself by doing a get on it directly - like testLst.get()
if (testLst != null && !testLst.isEmpty()) {
for (Test test : testLst) {
if (test.getName().equalsIgnoreCase("TEST")) {
// do blah
}
答案 0 :(得分:14)
当您检查变量的值是否为空(在本例中为testLst
)时,会显示此消息,而您之前已经访问过该变量。不需要进行空检查,因为如果值为null,则会抛出NullPointerException
。
示例:强>
testLst.remove(something);
if (testLst != null && !testLst.isEmpty()) {
for (Test test : testLst) {
if (test.getName().equalsIgnoreCase("TEST")) {
// do blah
}
检查testLst != null
是多余的,因为在程序到达if
语句时,testLst
不能为空,否则先前的语句testLst.remove(something)
将抛出{ {1}}。在这种情况下,您应该在访问NullPointerException
之前在 为空的地方进行空检查:
testLst
答案 1 :(得分:0)
我知道我对OP来说来不及了,但也许其他人可能会发现此帮助:
Sonarqube在该行上抛出此错误,这将导致初始NPE,而不是包含冗余null检查的行(错误消息另有说明)
对于OP:
w\n
我猜getValues()从不返回null,因此testLst不能为null,而只能在null检查时为空。
答案 2 :(得分:-1)
testLst = myTest.getValues(); //I am basically populating the array by doing a get, but I am not accessing the list itself by doing a get on it directly - like testLst.get()
if (testLst != null && !testLst.isEmpty()) {
for (Test test : testLst) {
if (test.getName().equalsIgnoreCase("TEST")) {
// do blah
}
你检查过myTest!= null? 否则声纳会抛出严重的违规行为。