当我结束这样的一行时,我认为会发生坏事。但编译器甚至没有抱怨。有没有人有一个想法,为什么这是合法的Java。当我用两个分号结束一行时,编译器不会抱怨。为什么?
displayDataMap.put("dateInterval", getDateInterval());;
编辑:原因Eclipse并没有抱怨,是因为在preference->java->compiler->Errors/Warning
我有空语句:如忽略。
当我结束这样的一行时,我认为会发生坏事。但编译器甚至没有抱怨。有没有人有一个想法,为什么这是合法的Java。当我用两个分号结束一行时,编译器不会抱怨。为什么?
displayDataMap.put("dateInterval", getDateInterval());;
编辑:原因Eclipse并没有抱怨,是因为在preference->java->compiler->Errors/Warning
我有空语句:如忽略。
这是一个空语句,是有效的。正如jwodder所指出的那样,更确切地说,空白语句是两个分号之间缺少声明,可以用两个连续的分号或用空格分隔的分号(即包括新行)来表示。
像Eclipse这样的IDE会警告你这个问题。如果您检查下面的图片,我已经插入线236中的红线是由我加入到集中注意力双分号,但是Eclipse给许多视觉线索:分号下
编译器使用分号来表示一个 '语句的结束'。先连续两次结束语句,然后创建第二个空语句。
真的,你甚至可以做到这一点:
displayDataMap.put("dateInterval", getDateInterval());;;;;;;;;;;;;;;
编译器不会抱怨,即使你刚刚创建.java扩展名的空文件。它是一个空的编译单元及其有效的。同样的分号是一个有效的空语句。
;意味着陈述结束。 ;对于;;对于;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;,;;;;;;;;;; ,第二个;
将暗示该声明不包含任何内容。
这是一个空语句,这是一样的,如果你这样做:
int x = 0;
;
没有问题存在!
下面是在C实际的例子:
#ifndef NDEBUG
#define Dprintf printf
#else
#define Dprintf(X)
#endif
if(some_test)
Dprintf("It's true!");
else
Dprintf("It's false.");
如果NDEBUG
定义,编译器将看到:
if(some_test)
;
else
;
这可以在某些情况下是有用的。因为Java深受C/C++的启发,所以它保留着它,即使它没有用,并且没有预处理器。
你可以,如果你愿意,可以在你的代码上运行C预处理器cpp
来做这种行为。
有些语言可能会说这是一个错误,而是由他们来选择。
很高兴看到';;;;'语句为什么在Java中有效。也许我们永远不会知道100%的确定性。现在问题变成了:这会不会改变并且变得无效? – anon58192932
我不认为它会改变 - 大多数人使用Oracle提供的相同的JavaC编译器。即使它确实存在,它也是一个非常简单的更新,只需在所有文件(如s /; {2,} /;/g – wormsparty
;
代表空语句,或者可以说,它代表Java中任何语句的终止行,即使您将多个语句放在Java中也是有效的。编译器不会给你任何错误,因为这是有效的。即使下面的说法也是有效的:
System.out.println("HI");;;;;;;;
)上调用正则表达式感谢,即可编辑上述语句。 – subodh
您是否咨询了语言规范?如果不是,为什么不呢? – Ingo
我没有查看下面的语言规范链接,但我的粗略搜索没有产生任何东西。你有链接,我可以看看? http://java.sun.com/docs/books/jls/third_edition/html/j3TOC.html – pacman
http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.6 – Ingo