为什么我在进行空检查时仍会在IntelliJ中收到关于可能的NPE的警告?

Jea*_*ôté 3 java lint intellij-idea nullpointerexception intellij-15

我有一个可以返回空值的函数。因此,我使用了JetBrains批注,并将@Nullable批注放在函数顶部。

@Nullable
public static ConnectionManager getConnectionManager() {
    return connectionManager;
}
Run Code Online (Sandbox Code Playgroud)

然后,我进行了皮棉检查。使用此功能时,我发现了4个地方,但未进行空检查。

之前:

Service.getConnectionManager().onAssetInfoChanged();
Run Code Online (Sandbox Code Playgroud)

后:

if(Service.getConnectionManager() != null) {
    Service.getConnectionManager().onAssetInfoChanged();
}
Run Code Online (Sandbox Code Playgroud)

然后,我再次运行Lint检查。令我惊讶的是,我仍然得到:

Service.getConnectionManager().onAssetInfoChanged()第308行的方法调用“ ”可能会产生“ java.lang.NullPointerException”。

我究竟做错了什么?这是Lint检查器中的错误吗?

Tun*_*aki 5

检查员不是完全错误的。NullPointerException在这种情况下,您可能会有一个:因为Service.getConnectionManager()每次都在调用,所以我们无法绝对确定null即使不是第一次也不会第二次返回:getter可能有一个比两个方法调用之间并发return ...设置的逻辑复杂,或者可能没有将变量设置为null同时设置。

因此,您可以将代码重构为:

ConnectionManager manager = Service.getConnectionManager();
if (manager != null) {
    manager.onAssetInfoChanged();
}
Run Code Online (Sandbox Code Playgroud)

假设的返回类型getConnectionManager()是type 的对象ConnectionManager。这样,就不可能NullPointerException在那条线上了。