2013-05-24 2 views
-2

Давайте посмотрим этот простой код Java:Почему эта Java-программа требует 2! = 2 с вложенными ifs?

class A { 
    public static void main(String[] args) { 
     if (1 == 1) 
      if (2 == 2) 
       if (2 != 2) // <-- should end here and do nothing 
        System.out.println("2 != 2"); 
      else 
       System.out.println("2 != 2"); 
     else 
      System.out.println("1 != 1"); 
    } 
} 

Как говорится в комментариях, он должен видеть 1==1, то 2==2, но наиболее вложенным условие 2!=2 выходит из строя, поэтому программа завершает работу без печати ничего. Но это не так, то вместо этого он говорит 2!=2:

$ javac A.java && java A 
2 != 2 

Почему?

Любопытно, что он работает, как ожидалось в Python:

>>> if (1 == 1): 
...  if (2 == 2): 
...   if (2 != 2): 
...    print("2 != 2"); 
...  else: 
...   print("2 != 2"); 
... else: 
...  print("1 != 1"); 
... 
>>> 

ответ

9

При правильном отступа (Ctrl + Сдвиг + F в Eclipse) вы видите, почему ваш результат представляется 2 != 2:

class A { 
    public static void main(String[] args) { 
     if (1 == 1) // true 
      if (2 == 2) // true 
       if (2 != 2) // false 
        System.out.println("2 != 2"); 
       else 
        System.out.println("2 != 2"); // is actually 2 == 2, gets executed 
      else 
       System.out.println("1 != 1"); // is actually 2 != 2 
    } 
} 

Вы, наверное, есть фон Python, где пространства материя. В Java они не имеют значения и могут быть помещены без влияния на выполнение. Если вы напишете if таких статусов, Java будет вставлять их внутренне, а не отступом (точно так же, как теги HTML - последние, если, в первую очередь, и так далее).

Чтобы предотвратить это, вы должны (всегда) использовать фигурные скобки в Java и использовать автоматическое форматирование (Ctrl + Сдвиг + F в Eclipse, как уже упоминалось выше). Это помогает с удобочитаемостью. BTW: Если вы не используете фигурные скобки в Java, то на if влияет только следующая строка. Затем вам придется добавлять фигурные скобки каждый раз, когда вам нужно выполнить несколько утверждений. Таким образом, скобки также улучшают расширяемость, поскольку вы всегда можете добавлять утверждения и не добавлять их позже.

9

Просто отступы ваш код и добавить фигурные скобки к нему:

class A { 
    public static void main(String[] args) { 
     if (1 == 1) { 
      if (2 == 2) { 
       if (2 != 2) { 
        System.out.println("2 != 2"); 
       } else { 
        //comes here 
        System.out.println("2 != 2"); 
       } 
      } else { 
       System.out.println("1 != 1"); 
      } 
     } 
    } 
} 

Поэтому при кодировании в Java настоятельно рекомендуется вы используете фигурные скобки, даже если у вас есть одна строка if или for предложение.

5

У вас есть другая проблема в коде Java.

В Java отступ не влияет на то, что if заявление else соединяется с. Это всегда самое близкое.

Вы можете решить это, используя фигурные скобки вокруг тел операторов if и else. Вы можете избежать этой проблемы, всегда используя фигурные скобки вокруг тел операторов if.

public static void main(String[] args) { 
    if (1 == 1) { 
     if (2 == 2) { 
      if (2 != 2) // <-- should end here and do nothing 
       System.out.println("2 != 2"); 
     } 
     else { 
      System.out.println("2 != 2"); 
     } 
    } 
    else { 
     System.out.println("1 != 1"); 
    } 
} 
0

В Java всегда используются фигурные скобки, в отличие от отступов Python не имеет значения, кроме как для удобочитаемости.

0

Интересно, что в матчах java else можно найти ближайшего, если, как рассказали другие плакаты здесь.Но если у вас любое другое заявление, прежде чем еще там следующим образом:

 if (1 == 1) 
      if (2 == 2) 
       if (2 != 2) // <-- should end here and do nothing 
        System.out.println("2 != 2"); 
     System.out.println("out of inner if loop !"); 
     else 
      System.out.println("2 != 2"); 
      else 
       System.out.println("1 != 1"); 

затем youe System.out заявление находится на том же уровне, что и самого внешнего, если заявление, и вы получите сообщение об ошибке в другое заявление, потому что Java не может сопоставить другое с любым. Вот почему в java нужны скобки.

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