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」來抑制,但是我想確保在這裏使用三元運算符沒有問題。有什麼建議?
實際上,我所看到的並不是第一個發出任何警告。然後再次,我被通知'org.jetbrains.NotNull'將被用來代替'@ Nonnull'。 – Makoto
@Makoto你提出一個好點;我之前將IDE配置爲使用javax註釋。我將不得不嘗試恢復該設置並查看JetBrains品牌註釋的行爲是否有所不同。 – nasukkin