Java Eclipse JDT空指针分析似乎对Objects.requireNonNull有特殊的行为,它可以';不可复制
Eclipse具有空指针注释分析,您可以附加外部注释。有相关文件,以防你在这里绊倒和困惑 无论如何,如果我附加JDK外部注释(也称为*.eea文件)并打开注释分析,我可以执行以下操作(假设someObject是Java Eclipse JDT空指针分析似乎对Objects.requireNonNull有特殊的行为,它可以';不可复制,java,eclipse,eclipse-jdt,eclipse-eea,Java,Eclipse,Eclipse Jdt,Eclipse Eea,Eclipse具有空指针注释分析,您可以附加外部注释。有相关文件,以防你在这里绊倒和困惑 无论如何,如果我附加JDK外部注释(也称为*.eea文件)并打开注释分析,我可以执行以下操作(假设someObject是@Nullable): Objects.requirennoull(someObject); someObject.toString()//此处没有错误/警告,因为Eclipse显然发现someObject不是null。 requirennoull的eea定义为: requireNonN
@Nullable
):
Objects.requirennoull(someObject);
someObject.toString()//此处没有错误/警告,因为Eclipse显然发现someObject不是null。
requirennoull
的eea定义为:
requireNonNull
<T:Ljava/lang/Object;>(TT;)TT;
<T:Ljava/lang/Object;>(T0T;)T1T;
显然,我可以通过重新分配:
someObject = MyObjects.likeRequireNonNull(someObject);
someObject.toString(); // No error or warning.
但在某些情况下,这是不可取的(lambdas)
由于某些对象现在被重新分配给一个@NonNull
,所以上面的错误是因为
因为我不知道如何复制对象的行为。requirennoull
在不需要重新分配的地方。我无法理解Eclipse如何通过外部注释知道对象
编辑:显然Objects.requirennoull可能在一个特殊的白名单上,根据这个bug:是的,正如我提到的,有一个已知方法的内部列表。MessageSend.detectAssertionUtility似乎是执行此检查的方法是的,很遗憾您无法自定义它。似乎EEA格式可以扩展,以便添加更多类型。现在它的0=null和1=NonNull。可以添加的是另外4种类型:2种用于可空/非空类方法,2种用于可空/非空类布尔类方法。
someObject = MyObjects.likeRequireNonNull(someObject);
someObject.toString(); // No error or warning.