【发布时间】:2015-04-12 16:46:05
【问题描述】:
我正在使用 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 中的一个错误?
【问题讨论】:
-
唯一(在我脑海中)是显而易见的——如果一个可序列化的实例被反序列化,除非它被处理,否则它将为空
-
@jdphenix 但是该方法已经检查了该条件。虽然如果这个对象被反序列化,testObj 将是 null 是正确的,但同样适用于默认初始化为 null 的非瞬态字段。我已经将该字段标记为@Nullable。该字段如何变为空不应该是一个问题。奇怪的是,IDEA 认为 testObj 可以在 检查它不是之后立即为空。
-
确实 - 我怀疑是错误。
-
我认为出现错误的部分没有被您复制到这里。 IntelliJ 指的是具有 NotNull 注释的方法,但根据代码的定义,它可以返回 null。 20号线是哪条线?知道这会很有帮助。你没有复制的 NotNull 方法在哪里?
-
@HamedMoghaddam 我复制了一个默认的版权标头,将所有内容都向上移动了,并且我将我的 IDEA 设置为假设所有方法都是非空的,除非另有说明。我的 IDEA 也设置为带有 NotNull 的别名 javax.annotation.Nonnull,因此差异不是问题。我解决了这个问题。
标签: java intellij-idea transient