Объяснение и исправление возможного разыменования нулевого указателя - PullRequest
7 голосов
/ 27 июля 2011

Инструмент проверки кода жалуется Возможно разыменование нулевого указателя safeScanWarnings в saveSafeScan (...) В строке if (safeScanWarnings! = Null & safeScanWarnings.size ()> 0)

Мне интересно, как это возможно?Это потому, что мы возвращаем коллекцию по ссылке?

protected void saveSafeScan(final Response response, final Dtec dtec) throws dtecException
    {
        Collection<String> safeScanWarnings = dtec.getSafeScanWarnings();
        if (safeScanWarnings!=null && safeScanWarnings.size()>0)
        {
            Iterator<String> iterator = safeScanWarnings.iterator();

            int i = 0;
            while (iterator.hasNext())
            {
                String safeScanCode = iterator.next();
                if (i == 0)
                {
                    response.setSafeScanCode(safeScanCode);
                    response.setSafeScanCodeText(getMessage(String.format("DTECRESPONSE_SAFESCANCODE_%s",
                            StringUtils.trimToEmpty(safeScanCode))));
                }
                SafeScanWarning safeScan = new SafeScanWarning();
                safeScan.setCode(safeScanCode);
                safeScan.setMessage(String.format("DTECRESPONSE_SAFESCANCODE_%s", StringUtils.trimToEmpty(safeScanCode)));
                safeScan.setPriority(i);
                response.getSafeScanWarnings().add(safeScan);
                i++;
            }
        }
    }

Ответы [ 3 ]

10 голосов
/ 27 июля 2011

Если он действительно указывает на эту строку, для меня это выглядит как ошибка в инструменте проверки кода.

Поскольку это локальная переменная, нет никаких шансов, что она будет изменена чем-то другимпроверка на ничтожность и вызов size() - так что нет никакого способа, которым он выбросит NullPointerException.

0 голосов
/ 22 октября 2013

Атрибут "dtec" должен быть секьюритирован:

    if (null!=dtec && null!=safeScanWarnings && safeScanWarnings.size()>0)
    {
      Collection<String> safeScanWarnings = dtec.getSafeScanWarnings();
0 голосов
/ 21 марта 2012

Существует ветвь оператора, которая при выполнении гарантирует, что значение null будет разыменовано, что сгенерирует NullPointerException при выполнении кода.Конечно, проблема может заключаться в том, что ветвь или утверждение неосуществимы и что NullPointerException никогда не может быть выброшено.Решив, что это за пределами способности FindBugs.

...