2015-10-01 3 views
1

Выполняя анализ ошибок с использованием klocwork, я получаю предупреждение Null pointer dereference of 'nextLineDn' where null is returned from a method.Предупреждение о блокировке Klockwork: Null pointer разыменовывает, где null возвращается из метода

Очевидно, что другой инструмент статического анализа findbug также дает такое же предупреждение.

Но, очевидно, я проверяю значение null/empty перед его использованием.

 int noOfLines = device.getLines().size();  
     if(lineNo != 0 && noOfLines > lineNo) // if next line exists  
     { 
      nextLineDn = device.getDn(lineNo+1);  
      if(!Util.isNullOrEmpty(nextLineDn)) 
      {  
       return (nextLineDn.contains("@")) ? nextLineDn.split("@")[0] : nextLineDn; 
      }  
     } 

class Util:

public static boolean isNullOrEmpty(String str) { 
    return (str == null || str.isEmpty()); 
} 

может кто-то дать мне некоторое представление об этом? Я получаю так много предупреждений с одинаковыми условиями. Не знаю, что еще можно сделать, чтобы удалить предупреждение.

+0

Опубликовать трассировку стека –

+0

Это инструмент статического анализа. 'getDn' возвращает null в случае, если ничего не найдено. – user3427748

+0

статический анализ ?? –

ответ

1

Поскольку Klocwork Insight является инструментом анализа статического исходного кода, возможно, он не сможет расшифровать то, что у вас есть метод с именем isNullOrEmpty() в классе Util, в котором вы фактически выполняете нулевую проверку. Таким образом, он показывает предупреждения в вашей среде IDE.

Инструмент статического анализа пытается найти потенциальные недостатки заранее. Итак, здесь Klocwork скажет: device.getDn() может возвратить null, будьте осторожны с использованием nextLineDn.

Но, если вы поместите код как (nextLineDn!=null), я предполагаю, что там не будет отмечено предупреждение. (Попробуйте и дайте нам знать)

+0

да, это правильно. Но ошибка идет только со строками. Если я использую какой-то другой объект, это не дает предупреждения, например, некоторые объекты класса. – user3427748

+0

Можете ли вы проверить метод device.getDn() и посмотреть, если он явно показывает, что он может вернуть значение null? Например, инициализируя строку до нуля, 'String returnString = null;' Тогда по какой-то причине позже getDn() возвращает значение null, так как returnString не назначается в этом сценарии ненулевое значение. Можете ли вы сравнить это с не-String-объектом, методы, возвращающие их, есть ли возможность вернуть null или нет? Поскольку инструменты статического анализа обычно идентифицируют потенциальные возможности нулевых ссылок таким образом: _ Если метод может возвращать значение null, то вызывающий может deference_ –

+0

Да, он возвращает значение null, если аргумент функции (dnNumber) равен нулю. Это единственный случай. – user3427748