[英]Why do I still receive warning for possible NPE in IntelliJ when I do my null checking?
我有一個可以返回空值的函數。 所以我使用JetBrains注釋並在函數頂部放置一個@Nullable
注釋。
@Nullable
public static ConnectionManager getConnectionManager() {
return connectionManager;
}
然后,我跑了一個Lint檢查。 當我使用這個函數時,我找到了4個位置,而我沒有進行任何空檢查。
之前:
Service.getConnectionManager().onAssetInfoChanged();
后:
if(Service.getConnectionManager() != null) {
Service.getConnectionManager().onAssetInfoChanged();
}
然后我再次進行Lint檢查。 令我驚訝的是,我仍然得到:
第308行的方法調用'
Service.getConnectionManager().onAssetInfoChanged()
'可能產生'java.lang.NullPointerException
'。
我究竟做錯了什么? 這是Lint檢查員的錯誤嗎?
檢查員並非完全錯誤。 在這種情況下你可能有一個NullPointerException
:因為你每次都調用Service.getConnectionManager()
,所以我們無法絕對肯定第二次它不會返回null
,即使它不是第一次time:getter可能有一個比return ...
更復雜的邏輯return ...
或者變量可能在兩個方法調用之間同時設置為null
。
因此,您可以將代碼重構為:
ConnectionManager manager = Service.getConnectionManager();
if (manager != null) {
manager.onAssetInfoChanged();
}
假設getConnectionManager()
的返回類型是ConnectionManager
類型的對象。 有了這個,就不可能在該行上有NullPointerException
。
問題是你要兩次調用Service.getConnectionManager()
。 在實際使用它的第二次調用時,Lint必須假設它現在可以為null。 解決此問題的一種方法是使用這樣的局部變量:
ConnectionManager connectionManager = Service.getConnectionManager();
if(connectionManager != null) {
connectionManager.onAssetInfoChanged();
}
另一種選擇,在我看來,首選方法是首先避免出現空值。 如果您使用的是Java 8,則可以使用Optional
來表示ConnectionManager
可以為null的事實。
最好的方法是確保您的ConnectionManager
實際上永遠不為null
首先, @Nullable
與可以為null的方法參數相關。 相反的是NotNull
,這意味着必須設置參數。 其次,每個getConnectionManager
調用都由分析器單獨處理。 像這樣做
ConnectionManager connManager = Service.getConnectionManager();
if(connManager != null
{
//do your stuff
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.