簡體   English   中英

當我進行空檢查時,為什么還會在IntelliJ中收到可能的NPE警告?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM