2017-08-28 46 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

回答

相关问题