为什么在return语句之后,当允许其他语句时,不允许使用额外的分号?

时间:2017-12-29 13:22:55

标签: java compiler-errors return

我在System.out.println分号后添加了一个分号:

System.out.println();;

这对Java编译器来说是合法的,所以我检查了其他语句,它们都是合法的。所以当我搜索并找到这些链接时:

  1. Why does Java not show an error for double semicolon at the end of a statement?

  2. Compiler doesn't complain when I ended a line with two semicolons. Why?

  3. When would you put a semicolon after a method closing brace?

  4. Why does code with successive semi-colons compile?

  5. Semicolon at end of 'if' statement

  6. 我开始明白额外的分号意味着额外的空话。

    但是当我在return语句后添加一个额外的分号时,出现了编译时错误。我得出结论,return语句被认为是执行流程中的最后一个语句,因此在return之后添加一个额外的语句是非法的。

    同样的事情也发生在这个代码中:

    if(a == b)
        System.out.println();;
    else
        System.out.println();
    

    if语句System.out.println();;内部给出了编译时错误,因为编译器期待elseifelse。我是对的还是还有其他原因吗?

4 个答案:

答案 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) { ;;;;;;;;;;;;;;;; } - 因为循环根本不会运行!