Java if-else行为

Java if-else行为,java,if-statement,Java,If Statement,我在代码中编写了一个简单的if/else,效果很好。后来,我在第一个下添加了另一个级别的if,并对其行为感到困惑。下面是非常简单的代码来重新创建这种情况: public static void main(String[] args) { boolean a = true; boolean b = false; if (a) if (b) System.out.println("a=true, b=true"); else

我在代码中编写了一个简单的
if/else
,效果很好。后来,我在第一个下添加了另一个级别的
if
,并对其行为感到困惑。下面是非常简单的代码来重新创建这种情况:

public static void main(String[] args) {
    boolean a = true;
    boolean b = false;

    if (a)
        if (b)
            System.out.println("a=true, b=true");
    else
        System.out.println("a=false");
}
它返回“
a=false
”,即使
a
为true

结果是,
else
与最近的
if
绑定,尽管我没有发现它在任何地方被记录,并且eclipse没有将不匹配的缩进级别作为错误突出显示(尽管在格式化文件时它确实更正了它)

关于使用大括号的一个非常非常有力的论点

else
/
的绑定顺序在哪里

作为一种挑战

有没有一种方法可以让上面的代码在不添加大括号的情况下实现缩进的预期效果

有没有一种方法可以让上面的代码在不添加大括号的情况下实现缩进的预期效果

不,因为Java不是Python,而且编译器不会根据您的想法工作。这就是为什么你应该总是使用大括号

显然,
else
是内部
if
的一部分,因此结果是预期的。这一点从

中可以明显看出,在

Java编程语言受到所谓的“悬而未决”的困扰 问题,

因此,语句在语法上分为两类:那些可能以没有else子句的if语句结尾的语句(“简短的if语句”),以及那些肯定没有的语句

在包含else子句的if语句中,只有绝对不以短if语句结尾的语句才可以作为关键字else之前的直接子语句出现。

Java语言规范的以下部分中对此进行了说明:

问题是外部if语句和内部if语句 语句可能拥有else子句 可能会猜测程序员希望else子句属于 到外部if语句

java编程语言,如C和C++以及许多编程 在它们之前的语言,任意地命令else子句属于 它可能属于的最里面的if。此规则为 由以下语法捕获:

有没有办法让上面的代码实现缩进的功能 你希望不加大括号

else;
将最终完成最里面的if

我想指出的是,如果我在生产中遇到这段代码,我会搜索提交日志,直到找到是谁写的。这绝对是一件不可接受的事情。但它回答了引用的问题

有没有办法让上面的代码实现缩进的功能 你希望不加大括号

我会说:

public static void main(String[] args) {
    boolean a = true;
    boolean b = false;

    if (!a)
        System.out.println("a=false");   
    else if(b)
        System.out.println("a=true, b=true");

}

首先也是最重要的,最好的建议是始终使用大括号

很自然地,每个else语句都附加到最近的if语句中,这一点从中可以看出,这就是为什么您的代码会以这种方式运行。编译器不关心缩进。您可以在一行上编写整个代码,只要语法正确,它仍然可以工作

此外,如果希望获得预期的输出,则将if语句嵌套在另一个if语句中(不使用else语句)是一种基本做法;这可以通过使用
&&
操作符来完成,如下所示:

if (a && b)
        System.out.println("a=true, b=true");
else
    System.out.println("a=false");

你已经得到了你想要的输出。我希望这有帮助。.祝你编码愉快!

一行代码不需要大括号,否则你需要,否则你认为它应该如何按照你期望的方式工作。你为什么会这样想呢?你的纯英语代码告诉你打印一个=耶稣基督的假副本!使用大括号!!是的,使用大括号。这不是python,甚至不是jython。为我辩护,我不是python程序员(尽管最近我开始使用它只是为了和你们这些穿着格子衬衫和胡子的年轻人一样时髦),我总是使用大括号,除非它是一行,而且大多数时候都是这样。所以我从一行开始,后来它变成了另一行,后来又得到了额外的if。是的,我当时应该添加大括号。意外的行为是出乎意料的,因为Eclipse训练了我,让我不再像以前那样仔细思考每个角色在过去的穿孔卡片上。因为Java不是Python…哈哈!这个答案是不正确的,正如@Cruncher的答案所证明的那样。@JeffSnider不确定是什么让你认为答案中提到的任何东西都是错误的。当然你可以想出病态的方法来避免大括号,但它会让代码变得真的不可读。@devnull the qu答案是“有没有办法……”,给出的答案是“没有”,这是错误的:另外两个答案给出了如何准确完成所要求的任务的示例。如果你想学究气,另一种让代码工作的方法是用Python编写它。为了清晰和常规起见,我强烈建议使用大括号。这严格来说是@Liam答案的一个不太优雅的版本。@Cruncher-True,这更笨重,但在我的头脑中更有意义。
public static void main(String[] args) {
    boolean a = true;
    boolean b = false;

    if (a && b)
        System.out.println("a=true, b=true");
    else if (!a)
        System.out.println("a=false");
}
if (a && b)
        System.out.println("a=true, b=true");
else
    System.out.println("a=false");