这个小错字有什么样的影响?

时间:2013-10-21 17:30:27

标签: java performance syntactic-sugar

我注意到在我的一个课程中,我有以下内容:

public void foo() {
    int i = 4;
    i = 9 + 0;;
    return;
}

连续两个;;。为什么这不是错误?应该是吗?根据我的理解,它只是编译器读取的“额外代码”代码。这会浪费性能吗?另外,如果它真的是空的,为什么我不能在返回后有两个;;? (例如return;;)?

编辑:在实践中有什么用?

2 个答案:

答案 0 :(得分:5)

  

为什么这不是错误?

因为该语言允许您在一行上写一个;来表示空行。您可以将尽可能多的;放在一起。请参阅JLS §14.6 - Empty Statement

  

这会浪费性能吗?

我不这么认为。你不应该真的担心如此微小的拼写错误的表现。 IMO,额外的分号不会使它成为字节码。因此,没有运行时性能差异。

  

另外,如果它真的是空的,为什么我不能有两个;回来后?

你不能在return语句之后放任何语句,因为无论如何都不会执行。这将是一个无法达成的声明。请参阅JLS §14.21 - Unreachable Statements

  

在实践中有什么用?

我可以想到的一个用途是enum,您要将其用作实用程序类。在这样的enum中,您只想定义一些静态方法,而不是任何常量。由于在enum中定义常量是必需的,因此不允许在任何常量之前编写方法。在这种情况下,你会像这样编写你的枚举:

enum Utility {
    ;   // Denote the end of constant declaration. You can't omit this ';'

    // Start writing your static methods.
}

答案 1 :(得分:4)

在java中,允许使用空白语句。 JLS §14.6 - Empty Statement

您无法执行return;;,因为空白语句将是无法访问的代码,这是不允许的。 JLS 14.21 Unreachable Statements

就浪费性能而言,我相信它会让你的编译时间更长一些。但是statement;;statement;应该编译为相同的字节码,因此不会影响运行时性能。

空白语句也是您必须非常小心循环语法的原因。很多时候我们在这里看过人们有的帖子:

while(condition);
{
    //code
}

这是一个无限循环,因为while后面有一个空白语句,所以它的循环体是空的。