当我用两个分号结束一行时,编译器不会抱怨。为什么?

时间:2011-09-27 14:40:56

标签: java

当我结束这样一条线时,我觉得会发生坏事。但编译器甚至没有抱怨。有没有人有一个想法,为什么这在java中是合法的。

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

编辑:Eclipse没有抱怨的原因是因为preference->java->compiler->Errors/Warning我有空语句:as ignore。

enter image description here

7 个答案:

答案 0 :(得分:10)

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

像Eclipse这样的IDE会警告你这件事。如果您查看下面的图片,我在第236行插入了一个双分号。我添加了红线以集中注意力,但Eclipse提供了许多视觉提示:

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

enter image description here

答案 1 :(得分:2)

编译器使用分号来表示“语句结束”。让两个连续结束第一个语句之前的语句,然后创建第二个空语句。

真的,你甚至可以这样做:

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

答案 2 :(得分: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来执行此类行为。

有些语言可能会说这是一个错误,它取决于他们选择。

答案 3 :(得分:2)

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

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

答案 4 :(得分:1)

意味着陈述结束。

for ;; ,第二个;意味着该陈述不包含任何内容。

答案 5 :(得分:1)

这是一个空洞的陈述,就像你这样做一样:

int x = 0;
;

没有问题!

答案 6 :(得分:0)

编译器即使只是创建一个扩展名为.java的空文件也不会抱怨。它是一个空的编译单元,它的有效。分号是一个有效的空语句。