Работает ли ELSE, за которым следует вложенный IF, без фигурных скобок? (JAVA)

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.

Каким бы ни было или должно быть поведение этого кода, отказ от фигурных скобок создает проблемы. Всегда используйте брекеты. И сделайте отступ в своем коде. Хороший код - это код, который читается людьми, а не только компиляторами.

JB Nizet 22.07.2018 12:58

Всегда используйте фигурные скобки - простое правило, которое предотвратит ненужные головные боли.

Joakim Danielson 22.07.2018 12:58
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
2
176
3

Ответы 3

Без фигурных скобок 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.

Другие вопросы по теме