簡體   English   中英

為什么在return語句之后,當允許其他語句時,不允許使用額外的分號?

[英]Why is an extra semicolon not allowed after the return statement, when it is allowed for other statements?

我在System.out.println分號后加了一個額外的分號:

System.out.println();;

這對Java編譯器來說是合法的,所以我檢查了其他語句,它們都是合法的。 所以當我搜索並找到這些鏈接時:

  1. 為什么Java在語句結尾處不顯示雙分號錯誤?

  2. 當我用兩個分號結束一行時,編譯器不會抱怨。 為什么?

  3. 什么時候你會在一個方法關閉括號后放一個分號?

  4. 為什么連續分號的代碼會編譯?

  5. 分號在'if'語句結束時

我開始明白額外的分號意味着額外的空話。

但是當我在return語句后添加一個額外的分號時,我得到了一個編譯時錯誤。 我得出結論, return語句被認為是執行流程中的最后一個語句,因此在return后添加一個額外的語句是非法的。

這個代碼也發生了同樣的事情:

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

if語句里面System.out.println();; 給出編譯時錯誤,因為編譯器期望elseif或者else 我是對的還是還有其他原因嗎?

為什么在return語句之后不允許多個分號,何時允許所有其他語句?

只是因為當你有一個類似的陳述時

System.out.println();;

這意味着你有兩個語句,一個是System.out.println(); 和其他語句在第一個semi colon ,它是空的並且允許但是你不能在return語句之后有任何空語句或任何其他語句,因為它永遠不會執行 ,換句話說, 它的無法訪問的語句 ,你可以'你的代碼中有無法訪問的語句

同樣的事情也發生在這個代碼中

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

那是因為,當你有一個else語句時,它之前的語句應該是if語句,而不是上面代碼片段中的語句,因為在else語句之前的語句是一個不允許的empty statement

如果在if statement后面有括號,如

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

你將不會得到任何錯誤,因為現在空語句在if block ,而else之前的語句是if statement而不是empty statement ,如果你在if statement之后沒有括號就是這種情況

你的代碼:

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

相當於

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

而且你不能使用else ,如果前面的語句是不是if

當你使用:

System.out.println();;

一個新的分號會生成一個新的空語句,編譯器也可以。 但是當你有

return; 

這是不允許的,因為你不能在return語句之后再添加任何語句,因為當方法返回時,它會在那里停止,並且之后的語句永遠不會被調用,所以不允許它!

Java語言規范§14.21說:

如果由於無法訪問語句而無法執行語句,則會發生編譯時錯誤。

額外的分號(在方法內)被解析為單獨的“空語句”( JLS§14.6 )。 如果從方法返回,那么后面的語句將無法訪問。 因此編譯器需要提供錯誤。

有趣的是,可達性規則有一個例外,可以方便地使用if語句進行條件編譯,如C的#if 因此,僅在return之前放置一個always-true if語句就足以滿足JLS以下任何后續語句是“可達”的:

if (true) return;;;;;;;;;;;;;;;;;;;;System.out.print("'reachable', but not really");;;

(那些額外的分號在return;之后是物理的return;但在語義上,它們在if 。)

其他語句,如return ,控制程序流,也可能導致語句無法訪問。 這些額外的分號也是不允許的:

  • throw null;;;;;;;;;;; - 因為拋出的NullPointerException退出塊
  • while (true);;;;;;;;;;;;;; - 因為循環永遠不會退出
  • while (true) { break;;;;;;;;;;;; } while (true) { break;;;;;;;;;;;; } - 因為循環總是提前退出
  • while (true) { continue;;;;;;;;; } while (true) { continue;;;;;;;;; } - 因為循環總是提前重復
  • while (false) { ;;;;;;;;;;;;;;;; } while (false) { ;;;;;;;;;;;;;;;; } -因為循環永遠不會運行在所有!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM