-2

让我们看看这个简单的 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, then 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");
... 
>>> 
4

5 回答 5

9

使用正确的缩进( Eclipse 中的Ctrl++ ShiftF,您会明白为什么您的结果似乎是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 标记 - last if,first else 等等)。

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

于 2013-05-24T20:26:14.977 回答
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一句话。

于 2013-05-24T20:21:00.677 回答
5

Java 代码中有一个悬而未决的 else 问题。

在 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");
    }
}
于 2013-05-24T20:21:08.697 回答
0

有趣的是,在 java 中 else 匹配到最近的 if ,正如其他海报所说的那样。但是,如果您在 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");

那么你的 system.out 语句与最外层的 if 语句处于同一级别,并且您将收到 else 语句的错误,因为 java 无法将 else 与任何 if 匹配。这就是为什么大括号在java中如此必要的原因。

于 2013-05-24T21:22:25.430 回答
0

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

于 2013-05-24T20:24:04.473 回答