Подтвердить что ты не робот

Почему оператор java if не работает, когда заканчивается точкой с запятой

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

String name = null;
String value = null;

if(name != null && value != null);
{
    System.out.println("Values not null");
}

Оператор if закончился с ;, это была моя ошибка, а Values not null была напечатана, даже если очевидно, что оба значения равны нулю. Может ли кто-нибудь объяснить, почему?

4b9b3361

Ответ 1

Эта точка с запятой завершает инструкцию (пустую), поэтому ваш код переводится компилятором примерно так:

if(name != null && value != null)
{
  //nothing here
}
{
  System.out.println("Values not null");
}

Другими словами, если выражение if равно true, оно выполняет пустой блок кода. Тогда независимо от того, был ли if истинным или нет, среда выполнения продолжает и запускает блок, содержащий System.out. Пустой оператор все еще является выражением, поэтому компилятор принимает ваш код.

Другое место, где может произойти такая ошибка:

for(int i = 0; i < 10; ++i);
{
  System.out.println("Y U always run once?");
}

или еще хуже (бесконечный цикл):

boolean stop = false;
while(!stop);
{
  //...
  stop = true;
}

Мне потребовалось несколько часов, чтобы узнать, в чем проблема:

Хорошая среда IDE должна немедленно предупредить вас о таком утверждении, поскольку она, вероятно, никогда не исправляется (например, if(x = 7) на некоторых языках).

Ответ 2

; завершает утверждение.

if(name != null && value != null);

эквивалентно:

if(name != null && value != null)
{
}

И следующий код - это просто блок кода.

Ответ 3

if(name != null && value != null);
{
    System.out.println("Values not null");
}

эквивалентно:

if(name != null && value != null){}

{
    System.out.println("Values not null");
}

Ответ 4

if(name != null && value != null);

Здесь ваш оператор if завершился из-за полуколонии...

Итак, это похоже на empty if block: -

if(name != null && value != null) {}

Итак, ваш следующий код становится блок инициализатора: -

{
    System.out.println("Values not null");
}

Так как это блок инициализатора. Он будет выполняться всегда независимо от того, какое условие if было оценено.

Ответ 5

Это стандартные правила грамматики. Точки с запятой завершают, но операторы могут быть пустыми, поэтому эти строки:

if (...);
{
}

эквивалентны:

if (...) /* do nothing */ ;

{
    ...
}

Следующий оператор { ... } выглядит просто как любой другой блок кода и всегда будет выполняться, потому что к нему выполняется инструкция if.

Ответ 6

Ваш код эквивалентен:

if(name != null && value != null) {
   // empty code block
}

System.out.println("Values not null");

Ответ 7

Полуколона завершает утверждение и, таким образом, отделяет if от следующего блока.

Обратите внимание, что блоки могут быть произвольными.

{
System.out.println("This is some code");
}

if(true); Это действительно, и он ничего не делает. Язык, допускающий это, довольно глупый, хотя IDE должны поймать эту проблему с предупреждениями и т.п.

Ответ 8

Один голый ; - это пустой оператор. После if должно быть ровно одно утверждение, которое будет выполняться, когда if - true. Один оператор, который выполняется в вашем случае, - это пустой оператор. Вы можете комбинировать большее количество операторов с одним с {statement; statement;...}

Ответ 9

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

Смысл в том, что следующее полностью допустимо, например:

if (var1 == true && var2 == true) var3 = 'both true';
{
    //block here, this is always executed regardless of the statements outcome
}

По сути, ваш код делает именно это. За исключением того, что ваш единственный оператор определяется как ; (да, это считается оператором).

То, что вы написали, совпадает с:

if(name != null && value != null) {
    // do nothing
}

System.out.println("Values not null");