【问题标题】:Compiler doesn't complain when I ended a line with two semicolons. Why?当我用两个分号结束一行时,编译器不会抱怨。为什么?
【发布时间】:2011-09-27 14:40:56
【问题描述】:

我以为当我这样结束一行时会发生不好的事情。但是编译器甚至没有抱怨。有谁知道,为什么这在java中是合法的。

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

编辑:Eclipse 没有抱怨的原因是因为在 preference->java->compiler->Errors/Warning 我有 Empty 声明:as ignore。

【问题讨论】:

标签: java


【解决方案1】:

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

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

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

【讨论】:

  • 具体来说,两个分号之间的空是一个空语句。
  • 这是要避免的,因为编译器会在每个空语句的字节码中插入 10000 个 NOP .... 不,只是在开玩笑 :)
  • @stivlo。感谢你的回答。我使用 Eclipse Indigo 和 Helios 版本进行了测试,两者都没有抱怨。
  • @pacman,请参阅我的更新答案。顺便说一句,我正在使用 Indigo,但这不是新功能。
  • @stivlo。看起来像我的日食偏好。由于某种原因,空语句被设置为忽略。现在我也看到了警告。我用截图更新了我的问题。不过感谢您的宝贵时间。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    这是一个 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 中是有效的。也许我们永远不会百分百确定。现在问题变成了:这会改变并变得无效吗?
    • 我认为它永远不会改变 - 大多数人都使用来自 Oracle 的相同 JavaC 编译器。即使有,更新也是一件非常简单的事情,只需在所有文件上调用正则表达式,例如 s/;{2,}/;/g
    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

      ;表示语句结束。

      对于;; ,第二个; 将暗示该语句不包含任何内容。

      【讨论】:

        【解决方案6】:

        这是一个空语句,就像你这样做一样:

        int x = 0;
        ;
        

        没有问题!

        【讨论】:

          【解决方案7】:

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

          【讨论】:

            猜你喜欢
            • 2012-05-21
            • 1970-01-01
            • 2012-09-12
            • 2012-06-19
            • 2019-06-16
            • 2015-12-07
            • 1970-01-01
            • 2016-04-22
            相关资源
            最近更新 更多