Почему оператор java if не работает, когда заканчивается точкой с запятой
Я ошибся при кодировании во время работы над приложением, это был тест для нулевой ссылки. Мне потребовалось несколько часов, чтобы узнать, в чем проблема, но я не понимаю, почему код вел себя так.
String name = null;
String value = null;
if(name != null && value != null);
{
System.out.println("Values not null");
}
Оператор if закончился с ;
, это была моя ошибка, а Values not null
была напечатана, даже если очевидно, что оба значения равны нулю. Может ли кто-нибудь объяснить, почему?
Ответы
Ответ 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");