2016-01-07 39 views
4

我處理以下方法:如何在檢查方法內避免空指針訪問警告?

boolean isNullOrEmpty(String s) { 
    return s == null || s.length() == 0; 
} 

麻煩的是,它不與@Nullable兼容。在下面的代碼中,當不應該顯示警告時,顯示警告。

void test(@Nullable String s) { 
    if (!isNullOrEmpty(s)) { 
    s.length(); // warning : o may be null 
    } 
} 

有沒有辦法讓這個警告消失,同時節省isNullOrEmptyNullable

+0

什麼是IDE /您使用產生這一警告的框架? IntelliJ例如不會產生警告,這要歸功於Object.isNull的方法契約:'!null-> false; null-> true'。 –

+1

根據您對@ Remi的回答發表的評論,我想知道您是否做了一個最小化,完整,可驗證的示例。 (也就是說,它可能只比Minimal少一點?)我還在想,問題是否存在於你的'isNullOrEmpty(List)'方法中,或者使用它的返回的布爾值。 –

+0

這是Eclipse嗎? –

回答

2

我認爲如果你重構了一下使用Optional你會更好。

@NonNull Optional<String> optNullOrEmpty(@Nullable String s) { 
    if (s == null || s.length() == 0) 
    return Optional.empty(); 
    else 
    return Optional.of(s); 
} 

然後你可以使用它作爲:

void test(@Nullable String s) { 
    @NonNull Optional<String> os = optNullOrEmpty(s); 
    if (os.isPresent()) { 
    @NonNull String s1 = os.get(); 
    s1.length(); // No warning :-) 
    } 
} 
+0

我喜歡它!我看到的唯一問題是重構成本('isNullOrEmpty'被稱爲很多)。 – fxm

+1

@fxm,是的,這是缺點。 OTOH,只要您打開@Nullable註釋,就會產生技術債務。此時您必須以某種方式觸及所有這些調用。並且完全基於我自己的主觀經驗,似乎'可選'和@Nullable齊頭並進。 –

3

有沒有理由不使用if(o!= null)?

Objects.isNull的目的是用作謂語: .filter(對象::參考isNull)

這個警告可能是一個錯誤,但。如果你真的想讓它消失,你可以用@SuppressWarnings註釋你的方法

+0

感謝您的答案!我知道這兩個解決方案,但他們不是我要找的:SuppressWarnings對於「真實代碼」太殘酷了,而'!= null'就是我想要避免的 – fxm

+0

我很好奇因爲你爲什麼希望避免使用!= null,它與lit.Objective.isNull(該方法只是做一個「return object == null;」)相同的東西 – Remi

+0

我有自定義函數執行'isNullOrEmpty'測試(在List , 例如)。這些函數與我用'isNull'描述的函數有相同的問題。 – fxm