findbugs msg: вызов метода принимает значение NULL для параметра без разыменования - PullRequest
1 голос
/ 08 декабря 2011

У меня есть ниже кусок кода:

          if (null != result[1]) {
                mySearchTO.setDt(dateFormat2.parse(result[1].toString()));
            } else {
                mySearchTO.setDt(null);
            }

Где результат - массив объектов, а dateFormat2 - SimpleDateFormat.

Findbugs дает следующее:

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

О чем говорит это сообщение? Как решить эту ошибку?

Я проверяю результат на null, чтобы мой метод Parse не прерывался. Но если результат равен нулю, я хочу установить для поля Dt в SearchTO какое-то значение по умолчанию, которое я здесь принимаю за ноль.

Есть ли лучший вариант по умолчанию для даты?

Спасибо за чтение!

Ответы [ 4 ]

2 голосов
/ 08 декабря 2011

Может быть жалоба на то, что mySearchTO или result могут быть нулевыми.

0 голосов
/ 08 декабря 2011

Согласно моему прочтению NP_NULL_PARAM_DEREF объяснения , Findbugs пытается предупредить вас, что это утверждение укусит вас NPE:

            mySearchTO.setDt(null);
            // guess there's line at mySearchTO.setDt looking like...
            // ... valuePassedToDt.toString() - would give NPE for null

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

Чтобы проверить, так ли это на самом деле, замените выше что-то вроде

            throw new RuntimeException("can't handle null in result[1]");

, затем повторно запустите Findbugs и посмотрите, исчезнет ли предупреждение.

0 голосов
/ 08 декабря 2011

Сообщение ссылается на массив result, вы только проверяете, что элемент с индексом 1 не является нулевым, но сам массив может быть также нулевым.

 if (result != null && null != result[1]) {
    mySearchTO.setDt(dateFormat2.parse(result[1].toString()));
 } else {
    mySearchTO.setDt(null);
 }

Я предположил, что mySearchTO и dataForma2 инициализированы правильно.

0 голосов
/ 08 декабря 2011

Возможно ли, что само ваше поле mySearchTO может быть нулевым?

В противном случае, возможно, не осознается, что result[1] уже проверяется на нулевое значение - возможно, это осложняется тем фактом, что он читает значение из массива. Что если вы сделаете что-то вроде Object o = result[1]; выше условного, отметьте o != null как условное, а затем вызовите o.toString() в условном выражении?

...