2013-08-10 1 views
2
.

Обычно в JAVA, если оператор IF не имеет фигурных скобок, может иметь только одну строку, которая выполняется, когда выполняется условие IF, однако если другой IF-блок (внутренний IF) следует за начальным IF, тогда никакая ошибка не срабатывает, и больше строк. Как это возможно?Почему IF-блок разрешен внутри другого IF, который не имеет фигурных скобок в JAVA.

Пример

if (true) 
if (true) 
    System.out.println("true"); 
else 
    System.out.println("false"); 
+0

good read http://www.cs.umd.edu/~clin/MoreJava/ControlFlow/nested-if.html –

+3

Java НЕ ПИСЬЕТ В КАПИТАЛНЫХ ХАРАКТЕРИЗАХ, но только с одним из них: Java. :) –

+0

очень первый оператор после if рассмотрит в корпусе if's –

ответ

2

Обычно в JAVA, если оператор IF не имеет фигурные скобки, может быть только одна строка, которая выполняется, когда IF условие выполнено,

коррекции. Оператор if без брекетов может иметь только один оператор , который выполняется при выполнении условия. И синтаксис if идет что-то вроде

if (<condition>) <statement>; [else <statement>;] 

То есть, если есть else, это часть if. Это все одно утверждение.

Причина, по которой нет ошибки, заключается в том, что здесь нет никакой двусмысленности. (Ну, а не компилятор, во всяком случае.) Поскольку else является частью if, он идет с ближайшим if.Так с правильными отступами, у вас есть

if (true) 
    if (true) 
     System.out.println("true"); 
    else 
     System.out.println("false"); 
5

без ошибок, потому что она равна

if (true) { 
    if (true) { 
     System.out.println("true"); 
    } 
    else 
    { 
     System.out.println("false"); 
    } 
} 

И действительный синтаксис.

Но, пожалуйста, всегда используйте {}, в противном случае очень сложно понять, где заканчивается блок if.

+1

+1 Я предлагаю вам всегда использовать стандартный отступ или использовать IDE, чтобы сделать это за вас. Таким образом, вы можете четко видеть вложенность, даже если у вас нет '{}' –

+0

if (true) int x = 0; int y = 0; совпадает с if (true) {int x = 0; int y = 0;} и все еще возвращает ошибку. – Alin

+0

@Alin Какую ошибку вы получили? –

2

Это потому, что ваш внешний блок if действительно содержит один оператор.

  • Если внутренний if условие истинно, внешний if эквивалентно:

    if (true) 
        System.out.println("true"); 
    
  • И если внутреннее if состояние, если false, это эквивалентно:

    if (true) 
        System.out.println("false"); 
    

Тем не менее, это действительно плохой идеей опустить фигурные фигурные скобки вокруг if-else или петли, если на то пошло, и специально делать это с вложенным блоком, может превратить зло. Просто потому, что это можно сделать, это не значит, что вы должны это делать.

Чтобы увидеть, как вложенные блоки if без брекетов могут расти уродливо и часто приводят к ошибкам, рассмотрите этот код, как вы думаете, должен ли быть выход?

boolean b = true; 
boolean b2 = false; 

if (b) 
    if (true) 
     System.out.println("true"); 
     if (b2) 
      System.out.println("Hello"); 
else 
    System.out.println("false"); 
0

считает это IF заявление, как:

if(true) { 
     if(true) { 
      System.out.println("true"); 
     } 
     else { 
      System.out.println("false"); 
     } 
    } 

если первый IF является true он идет к следующему утверждению, здесь следующее утверждение также IF, а также true поэтому выполняет в нем заявления. Если предположить, что это ложь, то поиск else завершает выполнение операторов в else. Таким образом, все утверждения охвачены, и сценарий ошибок не возникает.

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