Когда я выполняю 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
}
Почему это перестало работать в первом случае?
Я взял исходники FindBugs и поискал
NP_PARAMETER_MUST_BE_NONNULL_BUT_MARKED_AS_NULLABLE
Нашел два файла:
Оба рассматривают только «безусловное разыменование параметров».
Похоже, 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());
}
Вы хотите использовать @CheckForNull вместо @Nullable
@Nullable только для тех параметров, методов или полей, которым вы хотите разрешить быть нулевыми.
Похоже, что вы допускаете нулевые значения для текстовой переменной. Возможно, вместо этого вам следует использовать @NonNull.
Edit
Я попробовал это для себя и получил тот же результат.
Текст в отчете об ошибке findbugs (из второго метода, который дает ошибку nullpointer) гласит:
Этот параметр всегда используется таким образом, что требуется, чтобы он не был нулевым, но параметр явно аннотирован как Nullable. Либо использование параметра, либо аннотация неверна.
Я полагаю, что поскольку это не окончательный параметр, FindBugs не может/не хочет делать никаких предположений о значении параметра. значения _closed, поскольку вы можете изменить его в более позднее время. Я даже попытался сделать метод переменной _closed скопированным внутрь m1-метода, но он все равно не сообщает об этом как об ошибке.
Запустите JavaLint - я подозреваю, что он скажет вам, что
System.out.println(text.toLowerCase());
в первом примере недоступен. Поскольку он недоступен, я предполагаю, что FindBug не волнует, что он может вызвать исключение NullPointerException
edu.umd.cs.findbugs.annotations.Nullable [Target] Field, Method, Parameter
Аннотируемый элемент может быть нулевым при некоторых обстоятельствах. В общем случае это означает, что разработчикам придется прочитать документацию, чтобы определить, когда допустимо нулевое значение и нужно ли проверять его на нулевое значение. FindBugs будет относиться к аннотированным элементам так, как если бы они не имели аннотации.
На практике эта аннотация полезна только для переопределения общей аннотации NonNull.
Я согласен с alex2k8. Вероятно, это из-за элемента данных _closed. Его инициализация не имеет значения, пока она не объявлена окончательной. Статический анализ не имеет общих средств для определения фактических значений _closed во время выполнения, и никакое программное обеспечение не может этого сделать (это эквивалентно проблеме остановки ).