Java transient关键字和null

时间:2015-02-12 04:14:01

标签: java intellij-idea transient

我正在使用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中的一个错误?

1 个答案:

答案 0 :(得分:0)

编译器中的可空性非常严格。是的,您确实检查了null,但是存在一个问题,即您的代码可能在多线程上下文中使用。请考虑以下情况:

执行此块:

    if(testObj == null) {
        testObj = new Object();
    }

当前线程被抢占,另一个线程出现并将testObj设置为null。然后原始线程再次变为活动并完成执行并返回null的{​​{1}}。

编写此代码以避免空警告的正确方法如下:

testObj

在这种情况下,您可以保证返回值永远不会为空。

当然,这是一个相当紧凑的案例,大多数程序永远不需要这种安全级别,但这就是编译器应该检查null的方式。

当您添加瞬态时,空警告消失的事实,似乎是一个IntelliJ错误。但是,上面建议的代码是处理字段可空性的正确方法。如果这对你来说过于繁琐,我建议避免在字段上添加空注释。