2017-08-28 48 views
1

IntelliJ似乎認爲我的代碼存在潛在的錯誤,我不明白爲什麼。這與Nonnull註釋有關;我告訴IntelliJ,有些字段不能爲空,我確保它們永遠不會變爲null,但IntelliJ不喜歡它,完全相同。爲什麼IntelliJ的檢查員突出顯示此代碼?

以下是有問題的代碼示例。

import javax.annotation.Nonnull; 

public class Something { 
    static final Long DEFAULT_ID = -1L; 

    @Nonnull 
    public Long id; 

    public Something() { 
     id = DEFAULT_ID; 
    } 

    @Nonnull 
    public Long getId() { 
     return this.id; 
    } 

    public Something setId(Long id) { 
     this.id = id != null ? id : DEFAULT_ID; 
     return this; 
    } 
} 

當我做這個,的IntelliJ的檢查產生的setId(Long)方法原型的id參數警告,警告我說,對於id類字段都標註有Nonnull。儘管如此,我仍然需要手動檢查方法&中的空值。通過這種方法,Something#id永遠不會變爲空。

但是,如果我改變的方法是這樣的,檢查警告消失完全:

public Something setId(Long id) { 
    if (id != null) 
     this.id = id; 
    else 
     this.id = DEFAULT_ID; 
    return this; 
} 

從理論上講,這兩種實現方式實際上是相同的;實際上,IntelliJ建議在使用if-else方法時使用三元運算符,以達到文體目的。爲什麼IntelliJ會在第一次執行時發出警告 - 使用三元運算符 - 但不是第二次?這只是代碼檢查員的疏忽,還是我錯過了重要的東西?警告可以通過抑制「NullableProblems」來抑制,但是我想確保在這裏使用三元運算符沒有問題。有什麼建議?

+0

實際上,我所看到的並不是第一個發出任何警告。然後再次,我被通知'org.jetbrains.NotNull'將被用來代替'@ Nonnull'。 – Makoto

+0

@Makoto你提出一個好點;我之前將IDE配置爲使用javax註釋。我將不得不嘗試恢復該設置並查看JetBrains品牌註釋的行爲是否有所不同。 – nasukkin

回答

相關問題