![](/img/trans.png)
[英]Why is the semicolon not required but allowed at the end of a class definition?
[英]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編譯器來說是合法的,所以我檢查了其他語句,它們都是合法的。 所以當我搜索並找到這些鏈接時:
我開始明白額外的分號意味着額外的空話。
但是當我在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.