Как проверить нулевое значение в java
В этом коде.
public class Test {
public static void testFun(String str) {
if (str == null | str.length() == 0) {
System.out.println("String is empty");
} else {
System.out.println("String is not empty");
}
}
public static void main(String [] args) {
testFun(null);
}
}
Мы передаем нулевое значение функции testFun
. Компилируется нормально, но дает nullPointerException
во время выполнения.
Предположим, что значение фактического аргумента, передаваемого testFun
, генерируется из какого-то процесса. Предположим, что по ошибке этот процесс возвращает нулевое значение и передается в testFun. Если это так, как можно проверить, что значение, переданное функции, равно нулю или нет?
Одним (странным) решением может быть присвоение формального параметра некоторой переменной внутри функции и последующее ее тестирование. Но если в функцию передано много переменных, это может стать утомительным и неосуществимым. Итак, как можно проверить нулевые значения в таком сценарии?
Редактировать: по ошибке я написал || вместо | в условии if. Теперь генерируется исключение во время выполнения
Ответы
Ответ 1
Редактирование показывает точно разницу между кодом, который работает, и кодом, который этого не делает.
Эта проверка всегда оценивает оба условия, бросая исключение, если str
имеет значение null:
if (str == null | str.length() == 0) {
В то время как это (используя ||
вместо |
) является короткозамкнутым - если первое условие оценивается как true
, второе не оценивается.
См. раздел 15.24 JLS для описания ||
и раздела 15.22.2 для двоичного |
. Вступление к разделу 15.24 - важный бит, хотя:
Условный или оператор || оператор похож на | (§15.22.2), но оценивает его правый операнд, только если значение его левого операнда ложно.
Ответ 2
Проблема в том, что в вашем коде программа вызывает "null.length()", которая не определена, если аргумент, переданный функции, равен нулю. Вот почему выбрано исключение.
Ответ 3
Проблема в том, что вы используете побитовый или оператор: |
. Если вы используете логический или оператор, ||
, ваш код будет работать нормально.
См. также:
http://en.wikipedia.org/wiki/Short-circuit_evaluation
Разница между и и && в Java?
Ответ 4
Вы можете использовать StringUtils
:
import org.apache.commons.lang3.StringUtils;
if (StringUtils.isBlank(str)) {
System.out.println("String is empty");
} else {
System.out.println("String is not empty");
}
Посмотрите также: StringUtils.isBlank() vs String.isEmpty()
isBlank
Примеры:
StringUtils.isBlank(null) = true
StringUtils.isBlank("") = true
StringUtils.isBlank(" ") = true
StringUtils.isBlank("bob") = false
StringUtils.isBlank(" bob ") = false
Ответ 5
Изменить ниже линии
if (str == null | str.length() == 0) {
в
if (str == null || str.isEmpty()) {
теперь ваш код будет работать corel. Убедитесь, что str.isEmpty()
следует после str == null
потому что вызов isEmpty()
для null вызовет NullPointerException
. Поскольку Java использует оценку короткого замыкания, когда str == null
имеет значение true, она не будет оценивать str.isEmpty()