【问题标题】:How do I use @CheckForNull etc with Findbugs?如何在 Findbugs 中使用 @CheckForNull 等?
【发布时间】:2010-11-02 04:46:07
【问题描述】:

当我通过 Findbugs 运行它时,我收到一条警告:

static @NonNull Object foo(@CheckForNull Object arg) {
    if (arg == null) { // warning on this line
        throw new NullPointerException();
    }
    return "something";

}

警告详情如下:

错误:arg 必须为非空但被标记为可空
模式id:NP_PARAMETER_MUST_BE_NONNULL_BUT_MARKED_AS_NULLABLE,类型:NP,类别:STYLE

此参数的使用方式总是要求它为非空,但该参数被显式注释为Nullable。参数的使用或注释的使用是错误的。

有人能解释一下 Findbugs 在这里抱怨什么吗?

请注意,我使用的是 edu.umd.cs.findbugs.annotations.* 成员,而不是 javax.annotations.*。 (有区别吗?)

为 Eclipse 3.6.1 设置的是 FindBugs 插件 1.3.9.2009-。


Matthew Flaschen 建议我改用@NonNull,但现在我遇到了这个问题:

static void blah(@NonNull Object arg) {
    if (arg == null) {
        throw new NullPointerException();
    }
    System.out.println(arg);
}

static @CheckForNull Object bleh() {
    return null;
}

//...
blah(bleh()); // warning here!

警告的详细信息是:

Bug:由于被调用方法的返回值可能导致空指针取消引用
模式id:NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE,类型:NP,类别:STYLE

方法的返回值在没有null 检查的情况下被取消引用,并且该方法的返回值通常应该检查null。这可能会导致代码执行时出现NullPointerException

我基本上希望blah 满足@CheckForNull 的要求,但如果我将它的arg 设为@NonNull,我就无法做到。我如何让它发挥作用?

【问题讨论】:

    标签: java eclipse null annotations findbugs


    【解决方案1】:

    你自相矛盾。 CheckForNull 的意思是,“带注释的元素可能为空”,但如果是,则立即抛出。

    如果调用者传递 null 是不可接受的,我相信你应该改为注释它:

    static @NonNull Object foo(@NonNull Object arg) {
    

    【讨论】:

    • 在将其与 arg == null 进行比较时,将其注释为 @NonNull 不会导致问题,因为 Findbugs 认为没有必要?
    • @poly,不,我测试过。它仅在您标记参数CheckForNull 时发出警告。它不接受任何注释或NonNull。这是有道理的,因为 NonNull 本身并不能强制执行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多