Answers:
它通常是无用的,但在某些地方有必要。例如:
while (DoSomething());
这将执行DoSomething()
方法,直到返回false。显然,这是假设该方法还具有一些有用的副作用的。但是需要空语句,即结尾的分号,否则while循环将改为包含下一个后续语句。
(但与其他答案相反,for(;;) {}
这不是空语句的示例,因为for子句后的括号不包含语句,因此仅使用分号分隔(可选)表达式。有关详细信息,请参见Java语法。)
当在语法上需要语句但在语义上不需要语句时,可以使用它。像本示例一样,最常见的情况是省略for循环的一部分,尽管大多数人发现用法很奇怪且难以阅读。就像你的书说的那样,它很少使用。
while ( sleepPoll(device, 1000, TimeUnit.MILLISECONDS) ) { ; }
,全部在单独的行上。我本可以将其写为while ( true ) { if ( ! sleepPoll(device, 1000, TimeUnit.MILLISECONDS) ) { break; } }
,但这是错误的。
void method(){ //code here. If(condition){return ;}}
。
我更喜欢使用while循环,但是使用null表达式可以编写以下代码:
for (;;) { thread.run(); }
但是,空语句让您编写以下代码:
while(true);
{
thread.run();
}
这样做的主要目的是浪费时间紧随您之后的维护程序员,他们想知道为什么线程未运行。声明必须过一会儿。孤独; 是一个声明。因此,此语句块实际上不是循环的一部分。
这并不是说没有好的用途。他们只是很少见。它们通常如下所示:
{
;
}
因为这样看起来更像是您要执行此操作(即使有时这还不够)。
在汇编中,此空语句称为NOP。在Python中,这称为pass。在Java(和c的其他子代)中,正如您所说的,它是一个分号,甚至断言为true;
我知道一些用途:
语义的。
在空白处和放零作为答案之间是有区别的。它清楚地说,不,我没有忘记在这里放些东西。这什么都不意味着什么都没有。没什么明显的。此空间有意留为空白。这就是我们获取N / A的方式。
空模式
想象一下一台复杂且昂贵的光信号机,它反复从传送带上捡起一个彩色的灯泡,将其拧紧到插座中,打开电源,卸下并取出下一个。您可以通过戴在皮带上的灯泡的颜色来控制这件事的信号。太好了,现在终于可以完美地工作了,您的老板希望您创建一种方法来控制这些信号的时序。他想在消息之间添加一个空白。您会恐惧地记得,许多部分都在乎这些信号的时序,以及使它们同步的痛苦。您如何在不让您保持周末工作的情况下控制时间?您看一看已烧坏的灯泡,就会发现一个绝妙的主意。
有时您想使用多态来关闭某些内容而不破坏任何内容。
调试
设置断点时,需要有一个放置断点的地方。现在确保某些调试器可以让您将其设置在右花括号处,但如果没有,则该语言允许您强制放置一个位置,即使该位置不执行任何操作也很好。
并不是真正的Java东西,但也有:
二进制摆弄
汇编NOP指令允许摆弄已编译的二进制可执行文件。但是现代的Java编译器可以优化很多东西,所以我不确定分号是否只是po琐。但是在过去,我们还使用可执行文件中的这些空白点来控制时间或允许我们稍后挂机。没有NOP,那里将有实际的指令,因此,如果您要挂接,则必须将这些指令复制到其他地方以为挂接腾出空间。这在Java语言获得大部分语法的c语言中同样有效。但是我不认为这种钩子摆弄在Java中会发生太多。我们使用面向方面的编程来做到这一点。
for
不是空语句。空语句(又称空语句)可能出现在同一位置,而其他语句(如)可能出现在同一位置if
,但是后面的括号for
不允许在分号之间使用语句,而只允许使用初始化程序和两个表达式(它们是可选的)。因此,分号的用途与声明终止符的用途不同。空的语句将是最后一个分号for(;;);
我之所以使用它,是因为Java的设计方式与人类语言不符。C也是如此。
声明是statement;
。
if-then-else语句是 if (condition) statement; else statement;
具有复合块的if-then-else语句是 if (condition) {statements} else {statements}
这显然是胡说八道。
因此,我写if (condition) {statements} else {statements};
这是合乎逻辑和合理的。
如果Java的设计人员希望将其视为if-then-else后跟null语句,那么我很好。如果让他们开心,那就让他们开心。
if (condition) {statements;} else {statements;}
。而且,Java非常一致,不需要;
s after }
。有点像人类语言通常不会在已经以问号结尾的句子结尾加上句号。(当然,有!?
或?!
结尾,但仅‽
是interrobang字符的近似值。)