2013-05-19 2 views
2

Я перепутались с ниже код может не в состоянии различать два фрагмента кода:NullPointerException на Null Проверить

String Check=null; 

if(Check!=null && Check.isEmpty()){ 
    System.out.println("Get Inside"); 
} 

выше код работает отлично и выводит сообщение.

if(Check==null && Check.isEmpty()){ 
    System.out.println("get Inside") 
} 

этот код будет бросать NullPointerException.Not, способный различать между настоящим Кодексом Пожалуйста, помогите.

+0

Помните об этом: ==! =! = –

+0

@dirkk На самом деле '==' отлично (в том смысле, что он не генерирует исключение). Эта проверка не бросает NPE. Проблема в том, что другая сторона оценивается, тогда NPE бросается. – Maroun

+0

@MarounMaroun Конечно, с «этим» я ссылался на все заявление. Я просто думаю, что это очень очевидно, поскольку вы сначала проверяете, что 'Check' имеет значение null, а затем, тем не менее, получает доступ к этому элементу. – dirkk

ответ

7

Оператор &&короткое замыкание, он не оценивает правую сторону, если это не обязательно. В этом случае необходимо:

if(Check==null && Check.isEmpty()){ 
    System.out.println("get Inside") 
} 

Если Check является null (и это так), вы будете продолжать проверять состояние после &&, и вы получите Check.isEmpty(). Поскольку Check - null, это как null.isEmpty(), который является нэпом.

Почему?

Если у двух выражений есть && между ними, если первый из них является ложным, ответ всегда будет ложным, а другая сторона не будет проверяться, но когда первый - true, вам нужно продолжить и проверить другую чтобы узнать, должно ли все выражение быть оценено до true или false.

Но когда у вас есть:

if(Check!=null && Check.isEmpty()){ 
    System.out.println("get Inside") 
} 

Тогда правая сторона не будет достигнута, так как это излишним, чтобы проверить его. Вы уже получили false, и это не имеет значения, если вы получаете true или false на правой стороне, то результат будет false, так как это AND (FALSE & & WHATEVER = FALSE). Так зачем же проверять?

This link может вам помочь.

(я рекомендую вам следовать Java Naming Conventions и сделать переменные начинаться с нижнего регистра).

+0

Спасибо, сэр! Мне нравится ваш ответ, поскольку я был смущен этими фрагментами. Теперь у меня появилась идея, почему она выбрасывает ошибку. –

+0

Твой рад моему другу, я рад, что это тебе помогло, и, конечно же, ты можешь его принять, если хочешь :) – Maroun

1

&& означает, что сначала необходимо оценить левую сторону, если false, тогда все выражение равно false. Если левая сторона равна true, она оценивает правую сторону. В вашем случае:

if(Check==null && Check.isEmpty()) 

если Check является null, рядом он оценивает Check.isEmpty(), который бросает NullPointerException.

0
if(Check==null && Check.isEmpty()){ 
    System.out.println("get Inside") 
} 

В выше Check является недействительным, так идет и посмотреть на следующее состояние, которое является IsEmpty, который бросает NullPointerException.

1
if(Check==null && Check.isEmpty()) 

если Проверить действительно равен обнулить в другом состоянии, вы просто сказать null.isEmpty, который конечно приведет к NullPointerException поскольку && не имеет никакого отношения и бессмысленно вам нужно || вместо

if(Check==null || Check.isEmpty()){ 
    //no NullPointerException 
    System.out.println("get Inside") 
} 
1

Прежде всего позвольте мне сказать у вас разница между logical OR(||) and logical AND(&&). Если вы используете logical OR, если первое выражение: TRUE, the second expression is not evaluated; это означает, что если какое-либо одно выражение TRUE, условие выполняется и поток переходит в цикл. Но в случае AND, all the expressions must satisfy to TRUE to satisfy the condition. И если какое-либо из выражений оценивается как ЛОЖЬ, условие не выполняется.

Также имейте в виду, мы получаем NPE(Null Pointer Exception) when we try to call methods upon variables whose value = null.

Таким образом, в первом случае:

Check = нуль: первое условие не является ложным, дальнейшая обработка, как логическое И возвращает FALSE, если один из выражения FALSE. Второе выражение не оценивается (Check.isEmpty или вообще). Нет NPE, поскольку мы не вызываем методы при любом нулевом значении.

Второй случай:

Первое условие выполняется, поэтому второе условие вычисляется, который выбрасывает NPE, как Check = нуль, и мы вызов метода на нулевое значение.

Надеюсь, вы его получите!

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