0

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

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

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

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

4

2 回答 2

5

为什么这不是错误?

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

这会浪费性能吗?

我不这么认为。你真的不应该担心这样一个微小的错字的性能。IMO,额外的分号不会进入字节码。因此,不会存在运行时性能差异。

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

您不能在语句之后放置任何语句return,因为无论如何它都不会被执行。那将是一个遥不可及的声明。请参阅JLS §14.21 - 无法访问的语句

这在实践中有什么用?

我能想到的一种用途是enum您想用作实用程序类。在这种enum情况下,您只想定义一些静态方法,而不是任何常量。由于在 an 中定义常量enum是强制性的,因此不允许在任何常量之前编写方法。在这种情况下,你会这样写你的枚举:

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

    // Start writing your static methods.
}
于 2013-10-21T17:32:42.223 回答
4

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

您不能这样做return;;,因为空白语句将是无法访问的代码,这是不允许的。JLS 14.21 无法访问的语句

在浪费性能方面,我相信它会让你的编译时间更长一点。但是应该编译成相同statement;;statement;字节码,因此不会影响运行时性能。

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

while(condition);
{
    //code
}

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

于 2013-10-21T17:32:16.197 回答