2015-12-28 3 views
-1

Я следующий фрагмент кода:Java булево нулевой отливать

Boolean var=false; 
boolean var1=(var=null); 

if(var1){ 
    //it compiles 
} 
if(var=null){ 
    //it compiles 
} 

Почему компилировать?

В Boolean классе я нашел следующее:

public static boolean parseBoolean(String s) { 
     return ((s != null) && s.equalsIgnoreCase("true")); 
} 

Означает ли это, что null рассматривается как false? Почему результат операции = на boolean - false? Какова практическая причина такого поведения?

+3

Почему вы не начать свою программу и посмотреть, что происходит? Btw: 'if (null = var)' не будет компилироваться ... – Tom

+0

'if (null = var)' никогда не компилируется. –

+0

P.S: Var1 может быть правдой. = будет присвоить значение == будет сравнивать. В "boolean var1 = (var = null);" родительство - это просто утверждение. И в "if (null = var) {" он не должен компилироваться. Вы не можете определить значение до нуля – borjab

ответ

4

Что касается первого вопроса Почему компилировать?

Unedited версия: Это не компилируется

Это даст ошибку компиляции, поскольку if(null=var) { ... не правильный код Java. Вы не можете присвоить что-то null, вы можете только присваивать null что-то.

Возможно, вы захотите использовать == вместо var и null для обеспечения равенства.

Кроме того, во время выполнения вы получите NPE как @Ctx, уже правильно упомянутый. Линия boolean var1=(var=null); будет в первую очередь назначить null на var, то оператор присваивания = вернет то, что он только что назначен (null) и попытаться назначить, что в boolean var1 ->NPE.

  • "Означает ли это, что null рассматривается как false?" - нет t действительно. Только при разборе String, который составляет null, это обрабатывается как false. Это в основном единственное место/ситуация.

После редактирования меняющегося null=var в var=null:

Теперь ваш код будет скомпилирован и аварии с NPE. Давайте рассмотрим, что здесь происходит шаг за шагом:

Boolean var=false;Boolean объект создается с помощью автоматического бокса Значение booleanfalse
boolean var1=(var=null); Первая операция (var=null), которая присваивает null к var. = поэтому возврат null. Затем оператор «эквивалентен» boolean var1=null, который компилятор отклонил бы. К сожалению, компилятор не способен вывести, что оператор boolean var1=(var=null); всегда приведет к недопустимому присвоению boolean var1=null. Поэтому код компилируется, но сбой во время выполнения.

+2

Помните, что OP silenty аннулировал ваш ответ, манипулируя вопросом. Но поскольку история редактирования все еще существует, это не должно быть проблемой. – Tom

+1

@ Спасибо за то, что сообщили мне об этом. – luk2302

5

Назначение нуль к родному типу (например, логическое значение, междунар и т.д.) приведет к NullPointerException

0

Сначала вы знаете разницу между Boolean и boolean? Поскольку назначение null на boolean вызовет java.lang.NullPointerException.

0

i. Прежде всего, ваш код не будет компилироваться. Он даст вам ошибку компиляции на if (null = var) { // он компилирует } линия.

ii. Во-вторых, при инициализации примитивного типа данных вы не можете назначить нулевое значение. Если вы назначили его во время компиляции, это даст вам ошибку компиляции. Но если вы делаете это во время выполнения, это дает исключение nullPointerException. Точно так же boolean b = null; недействителен в java. Но Boolean bObj = null;. В то время как в вашем коде, когда вы делаете (var = null), он фактически возвращает значение null. следовательно, boolean var1 = (var = null); будет boolean var1 = null;. Здесь .. переменная var1 присваивается Значение null с учетом времени выполнения. Таким образом, это даст nullPointerException.

0

код должен быть написан как этот

Boolean var = false; 
    boolean var1 = (var == null); 
    if (var1) { 
     //it compiles 
    } 
    if (var == null) { 
     //it compiles 
    } 

Причиной является то, что var != null утратившим Boolean.FALSE не одни и те же Memeory

+0

'boolean var1 = (var = null);' компилирует отлично, но вызывает исключение во время выполнения. – Tom

+0

Вы правы, можете ли вы объяснить, почему он может усложнять, поскольку нет возвращаемого значения '=' – yanghaogn

+0

Существует возвращаемое значение: значение переменной. Вот почему вы также можете написать 'int a, b, c; a = b = c = 1; ' – Tom

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