我在System.out.println
分号后添加了一个分号:
System.out.println();;
这对Java编译器来说是合法的,所以我检查了其他语句,它们都是合法的。所以当我搜索并找到这些链接时:
Why does Java not show an error for double semicolon at the end of a statement?
Compiler doesn't complain when I ended a line with two semicolons. Why?
When would you put a semicolon after a method closing brace?
我开始明白额外的分号意味着额外的空话。
但是当我在return
语句后添加一个额外的分号时,出现了编译时错误。我得出结论,return
语句被认为是执行流程中的最后一个语句,因此在return
之后添加一个额外的语句是非法的。
同样的事情也发生在这个代码中:
if(a == b)
System.out.println();;
else
System.out.println();
在if
语句System.out.println();;
内部给出了编译时错误,因为编译器期待elseif
或else
。我是对的还是还有其他原因吗?
答案 0 :(得分:9)
为什么在return语句之后不允许多个分号 所有其他声明都允许吗?
只是因为你有一个像
这样的陈述System.out.println();;
这意味着你有两个陈述,一个是System.out.println();
而另一个陈述是在第一个semi colon
之后,它是空的,并且允许但你可以& #39;在return
语句之后有任何空语句或任何其他语句,因为它永远不会执行,换句话说,它无法访问的语句而你<您的代码中的“无法访问
此代码也发生了同样的事情
if(a == b)
System.out.println();;
else
System.out.println();
那是因为,当你有一个else
语句时,它之前的语句应该是if
语句,而上面的代码片段不是这样,因为{{1}之前的语句} statement是else
,不允许使用。
如果您在empty statement
之后有括号
if statement
你将不会得到任何错误,因为现在空语句在if(a == b) {
System.out.println();;
}
else
System.out.println();
内,而if block
之前的语句是else
而不是if statement
这是你的情况在empty statement
答案 1 :(得分:4)
您的代码:
fscanf
相当于
if (a == b)
System.out.println();;
else
System.out.println();
如果前面的陈述不是if (a == b) System.out.println();
;
else System.out.println();
,则您无法使用else
。
答案 2 :(得分:1)
使用时:
System.out.println();;
新的分号会生成一个新的空语句,编译器也可以。 但是当你有
时return;
这是不允许的,因为你不能在return语句之后再添加任何语句,因为当方法返回时,它会在那里停止,之后的语句永远不会被调用,所以不允许这样做!
答案 3 :(得分:1)
Java语言规范§14.21说:
如果由于无法访问而无法执行语句,则为编译时错误。
一个额外的分号(在方法内)被解析为一个单独的&#34;空语句&#34; (JLS §14.6)。如果从方法返回,那些后面的语句是不可访问的。因此,编译器需要提供错误。
有趣的是,可达性规则有一个例外,可以方便地使用if
语句进行条件编译,如C&#39 {s} #if
。因此,仅仅在if
之前放置一个始终为真的return
语句就足以满足JLS,以至于任何后续语句都可以到达&#34;:
if (true) return;;;;;;;;;;;;;;;;;;;;System.out.print("'reachable', but not really");;;
(那些额外的分号在return;
之后,但在语义上,它们在if
之后。)
与return
一样控制程序流的其他语句也可能导致语句无法访问。这些额外的分号也是不允许的:
throw null;;;;;;;;;;;
- 因为抛出的NullPointerException
退出了块while (true);;;;;;;;;;;;;;
- 因为循环永不退出while (true) { break;;;;;;;;;;;; }
- 因为循环总是提前退出while (true) { continue;;;;;;;;; }
- 因为循环总是重复提前while (false) { ;;;;;;;;;;;;;;;; }
- 因为循环根本不会运行!