Как исправить проблему FindBugs «Нулевое значение гарантированно будет остановлено» NP_GUARANTED_DEREF
-
26-10-2019 - |
Вопрос
Привет, у меня есть какой -то код, который, как сообщается, имел проблему NP_GUARANTED_DEREF от FindBugs. Теперь, глядя на свой код, я не совсем понимаю, что с ним не так, может кто -нибудь предложить, в чем проблема.
public void test() {
String var = "";
int index = 2;
if (index == -1) {
var = String.class.getName();
if (var.length() == 0) {
var = null;
}
} else {
var = Integer.class.getName();
if (var.length() == 0) {
var = null;
}
}
if (var == null) {// FINBUGS reports on this line NP_GUARANTEED_DEREF
/*
* There is a statement or branch that if executed guarantees that a value
* is null at this point, and that value that is guaranteed to be
* dereferenced (except on forward paths involving runtime exceptions).
*/
throw new NullPointerException("NULL");
}
}
Теперь бурение в ошибке в Findbugs. Он подчеркивает два назначения var = null;
Как причина ошибки, но я не совсем понимаю, почему. Это не так, как будто я на самом деле что -то делаю с var
Объект, я просто делаю нулевую проверку. Пример взят из реального производственного кода, но лишит всего, что не нужно для воспроизведения ошибки. Что мне интересно, является ли это ложным позитивным или нет. А если бы не то, что было бы подходящим исправлением.
Вот ссылка на детали ошибки FindBugs: http://findbugs.sourceforge.net/bugdescriptions.html#np_guarantied_deref
Обновление] После получения некоторых отзывов по этому вопросу я теперь зарегистрировал это как ложно -позитивный в ошибке FindBugs в SourceForge. https://sourceforge.net/tracker/?func=detail&aid=3277814&group_id=96405&atid=614693
Разговор о проблеме будет продолжаться.
Решение
Я понимаю. Я могу подтвердить то же поведение FB на моем компьютере. Действительно выглядит странно. Что смешно, что если ты заменил throw new NullPointerException
с throw new RuntimeException
Маркер ошибки исчезнет.
Теперь я думаю, что понимаю, что они имели в виду. Формулировка сообщения не является точной, но они предупреждают вас от NPE. Я предполагаю, что они считают явным выбросом NPE плохой практикой.
Другие советы
Это ошибка в Findbugs, опубликуйте этот вопрос на своей странице трекера. findbugs.sf.net
ОК, то, что ищет Findbugs, является заявлением или филиалом, которое гарантированно приведет к исключению нулевого указателя. Первоначально мы искали только выделения нулевых значений. Позже мы дополнили анализ для лечения
if (x == null) throw new NullPointerException()
так же, как явное обозначение x. Это было в первую очередь для помощи межпроцедурному анализу, так что методы, которые имели явные нулевые проверки на их параметры, обрабатывали то же самое, что и методы, которые определяют их параметры без явных нулевых проверок, и сообщать об ошибках, когда нулевые значения передаются для таких параметров.
Таким образом, некоторые из текстов в наших ошибках, возможно, должны быть обновлены, но мы действительно не нашли много реалистичных случаев, когда это вызывает путаницу.
Я не совсем уверен, какова цель вышеуказанного кода. В точках, где вы назначаете NULL VAR, вы создаете ситуацию, которая приведет к явному броску исключения нулевого указателя вниз. Это действительно то поведение, которое вы хотите?
Присмотреть ближе к определению сообщения об ошибке здесь, это говорит:
Существует заявление или филиал, что в случае выполнения гарантии того, что значение является нулевым на данный момент, и это значение, которое гарантированно будет остановлено (за исключением прямого пути, связанных с исключениями во время выполнения)
Это заставляет меня думать, что это либо просто позволить вам знать, что VAR будет нулевым, либо что -то на самом деле заставляет Findbugs думать, что VAR ссылается на оператор IF.
Код, который вы разместили, выглядит нормально, я бы дважды проверил, что VAR не доступен в истинном коде.
Единственное, что я могу изменить, - это написать сравнение назад, как так:
if (null == var)
Таким образом, это очевидно, если вы оставите одну из =
S/