java – 当我进行空检查时,为什么我还会在IntelliJ中收到可能的NPE警告?

我有一个可以返回空值的函数.所以我使用JetBrains注释并在函数顶部放置一个@Nullable注释.

@Nullable
public static ConnectionManager getConnectionManager() {
    return connectionManager;
}

然后,我跑了一个Lint检查.当我使用这个函数时,我找到了4个位置,而我没有进行任何空检查.

之前:

Service.getConnectionManager().onAssetInfoChanged();

后:

if(Service.getConnectionManager() != null) {
    Service.getConnectionManager().onAssetInfoChanged();
}

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

Method invocation ‘Service.getConnectionManager().onAssetInfoChanged()‘ at line 308 may produce ‘java.lang.NullPointerException‘.

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

解决方法:

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

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

ConnectionManager manager = Service.getConnectionManager();
if (manager != null) {
    manager.onAssetInfoChanged();
}

假设getConnectionManager()的返回类型是ConnectionManager类型的对象.有了这个,就不可能在该行上有NullPointerException.

上一篇:java swing单选按钮 – java.lang.NullPointerException


下一篇:尝试在空对象引用上调用虚方法’java.lang.String android.content.Context.getPackageName()’