什么时候在Java中使用null语句?


10

在我一直在寻找一个类的教科书中,有人说,一个语句可以为空(null语句)。null语句仅定义为分号。

它在执行时绝对不执行任何操作。null语句很少使用。

作为一个经验丰富的程序员,我发现有趣的是,他们说很少使用,这暗示着某个地方有用途。

这样的声明可能有什么用?

Answers:


7

它通常是无用的,但在某些地方有必要。例如:

while (DoSomething());

这将执行DoSomething()方法,直到返回false。显然,这是假设该方法还具有一些有用的副作用的。但是需要空语句,即结尾的分号,否则while循环将改为包含下一个后续语句。

(但与其他答案相反,for(;;) {}不是空语句的示例,因为for子句后的括号不包含语句,因此仅使用分号分隔(可选)表达式。有关详细信息,请参见Java语法。)


3
+1-这是我见过的唯一真正使用过的东西(如上所述,“ for”语句的空白部分略有不同)。我唯一要做出的更改是指出,如果将null语句留在自己的行上,而不是在while循环后立即显示,就像看起来是普通语句一样,那么读取这种用法非常容易混淆终结者...
朱尔斯

12

当在语法上需要语句但在语义上不需要语句时,可以使用它。像本示例一样,最常见的情况是省略for循环的一部分,尽管大多数人发现用法很奇怪且难以阅读。就像你的书说的那样,它很少使用。


那。是一种无用的语言功能。我宁愿被迫显式地读取重复内容,也不愿对Google“仅使用分号Java”。
克里斯·西里菲斯

2
@ChrisCirefice另一方面,“只是一个分号:考虑到您对语言的了解程度很明显,这是很明显的。这不是一个单独的规则,而是其他规则的结果。此外,如果您永远了解它,就可以学习它,所以我想说这不是什么大问题
Maurycy

1
如果您觉得自己正在写这样的循环,那说明您做错了。
死刑官

我有一种睡眠轮询方法,可用来检查设备何时恢复联机。当然,代码几乎是这样的:while ( sleepPoll(device, 1000, TimeUnit.MILLISECONDS) ) { ; },全部在单独的行上。我本可以将其写为while ( true ) { if ( ! sleepPoll(device, 1000, TimeUnit.MILLISECONDS) ) { break; } },但这是错误的。
BobDalgleish

这不是null语句,我们还用来强制退出“无效”方法吗?void method(){ //code here. If(condition){return ;}}
2016年

9

我更喜欢使用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中会发生太多。我们使用面向方面的编程来做到这一点。


2
这看起来似乎很古怪,但是示例for不是空语句。空语句(又称空语句)可能出现在同一位置,而其他语句(如)可能出现在同一位置if,但是后面的括号for不允许在分号之间使用语句,而只允许使用初始化程序和两个表达式(它们是可选的)。因此,分号的用途与声明终止符的用途不同。空的语句将是最后一个分号for(;;);
JacquesB '16

您是对的,这似乎很古怪:P。很好,请注意我的编辑。
candied_orange

-7

我之所以使用它,是因为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字符的近似值。)
8bittree

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.