我有一个可以返回空值的函数.所以我使用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.