Как использовать @CheckForNull и т. Д. С Findbugs? - PullRequest
1 голос
/ 02 ноября 2010

Когда я запускаю это через Findbugs, я получаю предупреждение:

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

}

Подробности предупреждения следующие:

Ошибка: arg должно быть ненулевымно помечается как обнуляемый
Идентификатор шаблона: NP_PARAMETER_MUST_BE_NONNULL_BUT_MARKED_AS_NULLABLE, тип: NP, категория: STYLE

Этот параметр всегда используется таким образом, что он должен быть ненулевым, но параметрявно аннотируется как Nullable.Либо использование параметра, либо аннотация неверна.

Может кто-нибудь объяснить, на что здесь жалуется Findbugs?

Обратите внимание, что я использую edu.umd.cs.findbugs.annotations.* членов, а не javax.annotations.*.(Есть ли разница?)

Установлен плагин FindBugs 1.3.9.2009 - для Eclipse 3.6.1.


Мэтью Флэшен предложил использовать вместо меня @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!

Подробности предупреждения:

Ошибка: возможное разыменование нулевого указателя из-за возвращаемого значения вызываемого метода
Patternid: NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE, тип: NP, категория: STYLE

Возвращаемое значение из метода разыменовывается без проверки null, а возвращаемое значение этого метода обычно должно бытьпровериться на null.Это может привести к NullPointerException при выполнении кода.

Я в основном хочу, чтобы blah удовлетворял требованию @CheckForNull, но я не могу сделать это, если я сделаю его аргумент@NonNull.Как мне заставить это работать?

1 Ответ

5 голосов
/ 02 ноября 2010

Ты противоречишь себе. CheckForNull означает «Аннотированный элемент может быть нулевым», но если это так, вы сразу бросаете.

Если для вызывающего абонента никогда не допустимо передавать значение NULL, я полагаю, что вы должны вместо этого аннотировать его:

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