Узнайте использование ошибок NullPointerException FindBugs

Когда я выполняю FindBugs на этом коде, он сообщает о проблемах NO.

boolean _closed = false;

public void m1(@Nullable String text) {
    if(_closed)
        return;

    System.out.println(text.toLowerCase());
}

В то время как здесь это находит проблему как ожидалось:

public void m1(@Nullable String text) {
    System.out.println(text.toLowerCase());  // FindBugs: text must be nonnull but is marked as nullable
}

Почему это перестало работать в первом случае?

9
задан Michal Kordas 11 May 2015 в 09:52
поделиться

6 ответов

Я взял исходники FindBugs и поискал

NP_PARAMETER_MUST_BE_NONNULL_BUT_MARKED_AS_NULLABLE

Нашел два файла:

  1. BuildUnconditionalParamDerefDatabase.java
  2. InconsistentAnnotations.java

Оба рассматривают только «безусловное разыменование параметров».

Похоже, FindBugs НЕ так полезен для поиска проблем с нулевым указателем: - (

PS

public void m1(@CheckForNull String text) {
    if(_closed) // FindBugs: text must be nonnull but is marked as nullable
        System.out.println(text.toUpperCase());
    else
        System.out.println(text.toLowerCase());
}
1
ответ дан 3 November 2019 в 09:30
поделиться

Вы хотите использовать @CheckForNull вместо @Nullable

0
ответ дан 3 November 2019 в 09:30
поделиться

@Nullable только для тех параметров, методов или полей, которым вы хотите разрешить быть нулевыми.

Похоже, что вы допускаете нулевые значения для текстовой переменной. Возможно, вместо этого вам следует использовать @NonNull.

Edit

Я попробовал это для себя и получил тот же результат.

Текст в отчете об ошибке findbugs (из второго метода, который дает ошибку nullpointer) гласит:

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

Я полагаю, что поскольку это не окончательный параметр, FindBugs не может/не хочет делать никаких предположений о значении параметра. значения _closed, поскольку вы можете изменить его в более позднее время. Я даже попытался сделать метод переменной _closed скопированным внутрь m1-метода, но он все равно не сообщает об этом как об ошибке.

0
ответ дан 3 November 2019 в 09:30
поделиться

Запустите JavaLint - я подозреваю, что он скажет вам, что

System.out.println(text.toLowerCase());

в первом примере недоступен. Поскольку он недоступен, я предполагаю, что FindBug не волнует, что он может вызвать исключение NullPointerException

-1
ответ дан 3 November 2019 в 09:30
поделиться

edu.umd.cs.findbugs.annotations.Nullable [Target] Field, Method, Parameter

Аннотируемый элемент может быть нулевым при некоторых обстоятельствах. В общем случае это означает, что разработчикам придется прочитать документацию, чтобы определить, когда допустимо нулевое значение и нужно ли проверять его на нулевое значение. FindBugs будет относиться к аннотированным элементам так, как если бы они не имели аннотации.

На практике эта аннотация полезна только для переопределения общей аннотации NonNull.

http://findbugs.sourceforge.net/manual/annotations.html

0
ответ дан 3 November 2019 в 09:30
поделиться

Я согласен с alex2k8. Вероятно, это из-за элемента данных _closed. Его инициализация не имеет значения, пока она не объявлена ​​окончательной. Статический анализ не имеет общих средств для определения фактических значений _closed во время выполнения, и никакое программное обеспечение не может этого сделать (это эквивалентно проблеме остановки ).

1
ответ дан 3 November 2019 в 09:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: