2011-09-27 59 views
6

当我结束这样的一行时,我认为会发生坏事。但编译器甚至没有抱怨。有没有人有一个想法,为什么这是合法的Java。当我用两个分号结束一行时,编译器不会抱怨。为什么?

displayDataMap.put("dateInterval", getDateInterval());;

编辑:原因Eclipse并没有抱怨,是因为在preference->java->compiler->Errors/Warning我有空语句:如忽略。

enter image description here

+2

您是否咨询了语言规范?如果不是,为什么不呢? – Ingo

+1

我没有查看下面的语言规范链接,但我的粗略搜索没有产生任何东西。你有链接,我可以看看? http://java.sun.com/docs/books/jls/third_edition/html/j3TOC.html – pacman

+1

http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.6 – Ingo

回答

10

这是一个空语句,是有效的。正如jwodder所指出的那样,更确切地说,空白语句是两个分号之间缺少声明,可以用两个连续的分号或用空格分隔的分号(即包括新行)来表示。

像Eclipse这样的IDE会警告你这个问题。如果您检查下面的图片,我已经插入线236中的红线是由我加入到集中注意力双分号,但是Eclipse给许多视觉线索:分号下

  • 锯齿状黄线。
  • 一个在第236行左边有一个警告标志的灯泡,通过悬停在该行上,它会弹出一条小信息,说“不必要的分号”。
  • 在包含目录和包的栏上,警告标志再次显示。它显示每个包或源文件夹,其中至少包含一个警告。
  • 在包资源管理器和导航器文件图标上将显示相同的灯泡图标(不在此截图中)。

enter image description here

+1

具体而言,两个分号之间的空白是一个空的陈述。 – jwodder

+3

这是要避免的,因为编译器会在每个空语句的字节码中插入10000个NOP ....不,只是在开玩笑:) – Ingo

+1

@stivlo。感谢你的回答。我使用Eclipse Indigo和Helios版本进行测试,两者都没有抱怨。 – pacman

2

编译器使用分号来表示一个 '语句的结束'。先连续两次结束语句,然后创建第二个空语句。

真的,你甚至可以做到这一点:

displayDataMap.put("dateInterval", getDateInterval());;;;;;;;;;;;;;; 
0

编译器不会抱怨,即使你刚刚创建.java扩展名的空文件。它是一个空的编译单元及其有效的。同样的分号是一个有效的空语句。

1

;意味着陈述结束。 ;对于;;对于;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;,;;;;;;;;;; ,第二个;将暗示该声明不包含任何内容。

1

这是一个空语句,这是一样的,如果你这样做:

int x = 0; 
; 

没有问题存在!

2

下面是在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来做这种行为。

有些语言可能会说这是一个错误,而是由他们来选择。

+0

很高兴看到';;;;'语句为什么在Java中有效。也许我们永远不会知道100%的确定性。现在问题变成了:这会不会改变并且变得无效? – anon58192932

+0

我不认为它会改变 - 大多数人使用Oracle提供的相同的JavaC编译器。即使它确实存在,它也是一个非常简单的更新,只需在所有文件(如s /; {2,} /;/g – wormsparty

2

;代表空语句,或者可以说,它代表Java中任何语句的终止行,即使您将多个语句放在Java中也是有效的。编译器不会给你任何错误,因为这是有效的。即使下面的说法也是有效的:

System.out.println("HI");;;;;;;; 
+0

)上调用正则表达式感谢,即可编辑上述语句。 – subodh

相关问题