2013-01-29 5 views
2

Я использую общедоступные ресурсы StringUtils.isNotBlank(), чтобы проверить, не является ли строка пустой и пустой. В некоторых сценариях для пустой строки или нулевой, как подтверждение ввода, не происходит, как ожидалось. Нулевой или пустой пробегает.Возможное исключение null-указателя в строковых utils

if(StringUtils.isNotEmpty(obj.getvalue())){ 
     ............. 
    } 

Когда я иду через documentation of StringUtils я нашел,

Побочный эффект обработки нуль является то, что NullPointerException следует рассматривать ошибку в StringUtils (для устаревших методов, за исключением).

Какая доза это означает? Это имеет какое-то отношение к моему сценарию?

+1

Можете ли вы быть более конкретным? У вас есть примеры кода? – Daniel

ответ

2

В некоторых сценариях для пустой строки или нулевой проверки входных данных не происходит, как ожидалось. Нулевой или пустой пробегает.

Либо есть ошибка в вашей логике проверки, либо у вас есть данные, поступающие от источника, который не подвергался проверке.

Если вы разместили фактический код и стек NPE, мы могли бы помочь вам его найти.


Что это значит?

Это означает, что если StringUtils.isNotBlank() выбрасывает NPE, возникает ошибка в методе. («Побочный эффект», что Javadoc говорит о является логической побочный эффект, т. Е вторичным логическим следствием так, что API определен)

Она имеет ничего общего с моим сценарий?

Это не имеет ничего общего с ним ... если вызов StringUtils.isNotBlank()является не бросать NPE.


UPDATE

Учитывая ваш пример кода (переделаны для иллюстративных целей):

if (StringUtils.isNotEmpty(obj.getvalue())){ 
    String s = obj.getvalue(); 
    if (s == null) { 
     System.err.println("Ooops!!"); 
    } 
} 

Я могу думать о ряде сценариев, в которых этот код может либо дать в NPE или причина "Ooops!" для печати. Например:

  1. Если obj является null тогда NPE, безусловно, будет брошен. Это может произойти до того, как вы вызвали isNotEmpty или (если значение переменной obj можно изменить, можно изменить) в блоке «then».

  2. Возможно, что метод getValue может выбросить NPE.

  3. Возможно (но маловероятно), что вызов getValue имеет побочный эффект, который заставляет его изменить состояние obj и возвращает другое значение (например, null) на 2-й вызов. По электронной почте Ой!

  4. Возможно, что какой-либо другой поток изменяет состояние объекта obj, пока текущий поток выполняет вышеуказанный код. По электронной почте Ой!

Большинство из этих проблем может быть "фиксированной" следующим образом:

String s = obj.getvalue(); 
if (StringUtils.isNotEmpty(s)){ // No NPE possible here now 
    if (s == null) { 
     System.err.println("Ooops!!"); // Cannot happen now. 
    } 
} 
+0

Я бегу в многопоточной среде. Мой сценарий происходит время от времени. Меня интересует побочный эффект, который присутствует в документации StringUtils ... – om39a

+2

Это не побочный эффект в этом смысле. Это ** логический ** побочный эффект; то есть логическим следствием того, как был разработан API. –

4

Прочитайте предложение выше, который вы цитируемый:

StringUtils обрабатывает нулевую входную Струну спокойно. То есть, нулевой ввод возвращает null. Если возвращается логическое значение или int , информация зависит от метода.

Побочным эффектом нулевой обработки является то, что исключение NullPointerException должно считаться ошибкой в ​​StringUtils (за исключением устаревших методов ).

Так как он обрабатывает нулевые значения, он не должен вызывать NullPointerExceptions.

А если проверить метод, isNotBlank, вы найдете эту таблицу:

StringUtils.isNotBlank(null)  = false 
StringUtils.isNotBlank("")  = false 
StringUtils.isNotBlank(" ")  = false 
StringUtils.isNotBlank("bob")  = true 
StringUtils.isNotBlank(" bob ") = true 

если вы получаете другие значения, вы действительно испытываете ошибку, которую вы должны сообщить. Но более вероятно, что NPE вызван чем-то другим. Может быть, какой-то другой метод StringUtils вернул null, например.

0

Для детального изучения вашей проблемы вы можете опубликовать конкретный пример, где код по вашему мнению ошибочен.

StringUtils Поведение

  • StringUtils.isNotBlank (нуль) возвращает ложное
  • StringUtils.isNotBlank ("") возвращает ложное
  • StringUtils.isNotBlank (»«) возвращает ложные
  • StringUtils .isNotBlank ("testvalue") возвращает true

Если значение поведение - это что-то еще, это ошибка в libary

0

Возможно ли, что NPE выбрасывается из obj.getvalue() в StringUtils.isNotBlank() никогда не будет бросать NPE. Если вы используете свой код в многопоточной среде, вы можете синхронизировать свой метод, чтобы предотвратить одновременный доступ к вашему методу из нескольких источников.

Дополнительную помощь вы можете отправить stack trace или code block?

0

На самом деле существует ошибка в методе StringUtils.isNotBlank() или в документации. Если вы пройдете null до isNotBlank(), он поднимет NullPointerException, что противоречит документации. Таким образом, один или другой (код или документация) является неправильным.

Вот хорошая замена с использованием Guave из: http://www.javaworld.com/article/2074361/core-java/checking-for-null-or-empty-or-white-space-only-string-in-java.html

Смежные вопросы