我注意到在我的一个课程中,我有以下内容:
public void foo() {
int i = 4;
i = 9 + 0;;
return;
}
连续两个;;
。为什么这不是错误?应该是吗?根据我的理解,它只是编译器读取的“额外代码”代码。这会浪费性能吗?另外,如果它真的是空的,为什么我不能在返回后有两个;;
? (例如return;;
)?
编辑:在实践中有什么用?
答案 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后面有一个空白语句,所以它的循环体是空的。