空的 if 语句

2022-09-01 18:45:21

通过“空的if语句”,我的意思是这样的(注意分号):

if (condition);

我在考虑此应用程序时遇到问题。通过 while 循环,您可以执行以下操作:

while (callUntilReturnsFalse());

但是没有这样的 if 语句应用程序。更重要的是,Java编译器在遇到此类语句时不会发出错误或警告。这可能会导致大而无声的问题,特别是对于冗长而复杂的语句:

if ((functionA() && functionB(getFoo()) ||
    checkForComplexCondition(arg1, arg2, getBar(getFoo())));
{
    doStuff();
}

我的问题是:为什么Java允许这样做?而且,更重要的是,当发生这种情况时,我是否可以启用一个选项来引起警告?

(这个问题之前被问到过关于C#,它确实发出了警告,但我希望找到一种方法来引起Java的警告。


答案 1

为什么在Java中允许这样做?

请参阅 Java 语言规范 (14.6.空语句)

空语句不执行任何操作。

它只是允许的,它等同于(并将被翻译成):

if (condition) {  }

这意味着,如果条件为真,则不执行任何操作。

如果你正在使用eclipse,你可以看看这里,你可能会发现一些有用的东西(我不确定是否存在分号终止符这样的选项):

Windows首选项Java编译器错误/警告

enter image description here


编辑

正如@nullptr在他的回答中指出的那样,存在一个IDE警告,您需要在空语句上设置警告


答案 2

我不认为这与问题的意图真正相关,但我认为应该说明它,因为它与问题的本质有关。

有一个效果:

if(variable);

如果变量为 。它的效果是导致当前线程和访问变量的任何其他线程之间遵守内存屏障。volatile

public volatile variable;
....
if(variable);

有关更详细的讨论,请参阅此处

我无法想象将这种语句放在代码中的任何真正价值,但我觉得重要的是要注意,在这种非常具体的情况下,此语句具有真正的效果。


推荐