我正在使用Intellij IDEA,并且以下代码会生成警告:" Expression testObj might evaluate to null but is returned by the method declared as @NotNull (at line 16)
"
package com.dlp;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
public class TestCase {
@Nullable
private transient Object testObj = null;
@Nonnull
public Object getTestObj() {
if(testObj == null) {
testObj = new Object();
}
return testObj; //Line 16
}
}
只有将testObj标记为瞬态时才会发生这种情况。删除关键字会清除警告。瞬态和可空性之间是否存在一些我没有得到的相互作用,或者这只是IDEA中的一个错误?
答案 0 :(得分:0)
编译器中的可空性非常严格。是的,您确实检查了null,但是存在一个问题,即您的代码可能在多线程上下文中使用。请考虑以下情况:
执行此块:
if(testObj == null) {
testObj = new Object();
}
当前线程被抢占,另一个线程出现并将testObj
设置为null。然后原始线程再次变为活动并完成执行并返回null
的{{1}}。
编写此代码以避免空警告的正确方法如下:
testObj
在这种情况下,您可以保证返回值永远不会为空。
当然,这是一个相当紧凑的案例,大多数程序永远不需要这种安全级别,但这就是编译器应该检查null的方式。
当您添加瞬态时,空警告消失的事实,似乎是一个IntelliJ错误。但是,上面建议的代码是处理字段可空性的正确方法。如果这对你来说过于繁琐,我建议避免在字段上添加空注释。