我注意到在我的一堂课中,我有以下内容:
public void foo() {
int i = 4;
i = 9 + 0;;
return;
}
连续两个;;
。为什么这不是错误?应该是吗?据我了解,这只是编译器读取的“额外行”代码。这会浪费性能吗?另外,如果真的是空的,为什么;;
退货后我不能有两个?(如return;;
)?
编辑:这在实践中有什么用?
我注意到在我的一堂课中,我有以下内容:
public void foo() {
int i = 4;
i = 9 + 0;;
return;
}
连续两个;;
。为什么这不是错误?应该是吗?据我了解,这只是编译器读取的“额外行”代码。这会浪费性能吗?另外,如果真的是空的,为什么;;
退货后我不能有两个?(如return;;
)?
编辑:这在实践中有什么用?
为什么这不是错误?
因为该语言允许您;
在一行上写一个单行来表示一个空行。您可以将尽可能多的放在;
一起。请参阅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.
}
在 java 中,允许使用空白语句。JLS §14.6 - 空语句
您不能这样做return;;
,因为空白语句将是无法访问的代码,这是不允许的。JLS 14.21 无法访问的语句
在浪费性能方面,我相信它会让你的编译时间更长一点。但是应该编译成相同statement;;
的statement;
字节码,因此不会影响运行时性能。
空白语句也是您必须非常小心循环语法的原因。很多时候,我们在这里看到人们发布的帖子:
while(condition);
{
//code
}
这是一个无限循环,因为while后面有一个空白语句,所以它的循环体是空的。