Java 满足FindBugs和IntelliJ IDEA的最终字段上的非空注释

Java 满足FindBugs和IntelliJ IDEA的最终字段上的非空注释,java,findbugs,Java,Findbugs,我试图编写一个不可变的数据类,它使用@Nonnull来标记所需的参数。不幸的是,无论我以何种方式编写,FindBugs都会发出警告: /** *迁移期间发生错误 */ @不变的 @默认情况下,参数SarenonNullBy 公共静态最终类MigrationError扩展了MigrationResult { 私有最终字符串消息; 私有迁移错误(字符串消息) { this.message=消息; } @凌驾 公共布尔值isSuccess() { 返回false; } @非空 公共最终字符串getMe

我试图编写一个不可变的数据类,它使用@Nonnull来标记所需的参数。不幸的是,无论我以何种方式编写,FindBugs都会发出警告:

/**
*迁移期间发生错误
*/
@不变的
@默认情况下,参数SarenonNullBy
公共静态最终类MigrationError扩展了MigrationResult
{
私有最终字符串消息;
私有迁移错误(字符串消息)
{
this.message=消息;
}
@凌驾
公共布尔值isSuccess()
{
返回false;
}
@非空
公共最终字符串getMessage()
{
返回消息;
}
@凌驾
公共迁移错误asError()
{
归还这个;
}
}
如前所述,这将导致一个正确性警告-Null指针解引用,方法可能返回Null,但声明为@Nonnull。我已尝试在构造函数中添加空检查:

然而,警告仍然存在,我现在从Intellij得到一个额外的警告,“message==null”总是false。如果在getter中添加空检查:

我从IntelliJ得到了同样的警告,FindBugs给了我一个新的警告:不可靠的代码:对null的冗余比较:对已知为非null的值的冗余null检查。如果我删除显式空检查并将
@Nonnull
添加到
消息
字段,我将得到相同的FindBugs警告


我可以抑制警告,但我想知道FindBugs期望什么。是否存在将不可变字段声明为非空的模式?它是其父类中的静态嵌套类是否重要?

FindBugs使用了一组复杂的启发式方法,因此很难诊断其误报和误报。作为比较,的处理此代码时不会发出任何误报警告。您不需要修改注释,因为检查器框架可以。请尝试将
message
提升到本地变量中,并执行空检查并针对本地变量返回。感谢@jmehrens的建议,不幸的是,这会导致冗余空检查警告。可能只是将其归结为复杂的启发式,然后继续。另请参见FindBugs使用了一组复杂的启发式,这使得很难诊断其误报和误报。作为比较,的处理此代码时不会发出任何误报警告。您不需要修改注释,因为检查器框架可以。请尝试将
message
提升到本地变量中,并执行空检查并针对本地变量返回。感谢@jmehrens的建议,不幸的是,这会导致冗余空检查警告。可能只是将其归结为复杂的启发式,然后继续。另请参见
    private MigrationError(String message)
    {
        if (message == null)
        {
            throw new IllegalArgumentException("Error message cannot be null");
        }
        this.message = message;
    }
    @Nonnull
    public final String getMessage()
    {
        if (message == null)
        {
            return "";
        }
        return message;
    }