为什么这个Java程序使用嵌套ifs声明2!= 2?

时间:2013-05-24 20:19:11

标签: java if-statement boolean-logic nested

让我们看看这个简单的Java代码:

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");
... 
>>> 

5 个答案:

答案 0 :(得分: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进行编码时即使有一行iffor句子也要使用大括号。

答案 1 :(得分:9)

在Eclipse中使用正确的缩进( Ctrl + Shift + F ),您会看到为什么您的结果似乎是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标记一样 - 最后是if,first else等等。)

为了防止这种情况,你应该(总是)在Java中使用大括号并在Eclipse中使用自动格式化( Ctrl + Shift + F 正如刚才提到的)。这有助于提高可读性。顺便说一句:如果你不在Java中使用大括号,if只会影响以下行。然后,每次需要执行多个语句时,都必须添加大括号。因此,大括号也可以提高可扩展性,因为您可以随时添加语句,而不必在以后添加它们。

答案 2 :(得分: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");
    }
}

答案 3 :(得分:0)

在Java中总是使用大括号,不像Python缩进除了可读性之外无关紧要。

答案 4 :(得分:0)

有趣的是,在其他海报中,如果正如其他海报所述,则在其他地方匹配。但是,如果你之前有任何其他陈述,则如下:

        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");

那么你的system.out语句与最外面的if语句处于同一级别,你会得到错误的else语句,因为java不能匹配任何if。这就是为什么大括号在java中是如此必要。