public class Main
{
public static void main(String[] args) {
int i=0;
int j=10;
if (i>0)
if (j>0)
System.out.println("Hello World");
else
System.out.println("else");
}
}
Ожидаемый ответ - "else",
так как i=0 и, следовательно, ELSE должны быть выполнены.
Но на выходе получается "Hello World"
Код отлично работает, когда я добавляю фигурные скобки к внешнему if.
Всегда используйте фигурные скобки - простое правило, которое предотвратит ненужные головные боли.




Без фигурных скобок else принадлежит второму (внутреннему) оператору if, поэтому он не достигается, если первый (внешний) оператор if оценивается как false.
Это эквивалентно:
if (i>0) {
if (j>0) {
System.out.println("Hello World");
} else {
System.out.println("else");
}
}
Ваш код НИЧЕГО не печатает.
Согласно документации:
The Java programming language, like C and C++ and many programming languages before them, arbitrarily decrees that an else clause belongs to the innermost if to which it might possibly belong.
при использовании вложенного if else без фигурных скобок блок else связывается с ближайшим if. Итак, ваш код похож на этот:
if (i>0) {
if (j>0){
System.out.println("Hello World");
}
else{
System.out.println("else");
}
}
Этот фрагмент кода даст вам результат, который вы ищете:
int i = 0;
int j = 10;
if (i>0) {
if (j > 0)
System.out.println("Hello World");
}
else
System.out.println("Else");
Проблема в исходном коде заключается в том, что у вас есть этот оператор:
if (i>0)
if (j>0)
System.out.println("Hello World");
Система в этой ситуации оценивает первый оператор if, который имеет значение True, но, поскольку в нем нет фигурных скобок, он не рассматривается как вложенный оператор if, поскольку у вас есть несколько операторов в его области действия (другой оператор if и System.out.println), который вы хотите инкапсулировать в его 'область видимости. Таким образом, он никогда не оценивается как True. Однако оператор else связан с оператором if (j <0), поэтому оператор else также никогда не запускается в этом сценарии. Таким образом, вы получаете код, который не выполняется. Чтобы решить эту проблему, я помещаю второй оператор if в область действия первого оператора if с помощью фигурных скобок. В этом примере НЕ ОБЯЗАТЕЛЬНО заключать оператор else в фигурные скобки. Теперь, когда система знает, что второй оператор if вложен в область действия первого оператора if, оператор else связан с первым оператором if и будет выполняться, если I не больше 0.
Каким бы ни было или должно быть поведение этого кода, отказ от фигурных скобок создает проблемы. Всегда используйте брекеты. И сделайте отступ в своем коде. Хороший код - это код, который читается людьми, а не только компиляторами.