2013-10-21 29 views
0

我注意到,在我的班級之一,我有以下幾點:這個小錯字有什麼樣的效果?

public void foo() { 
    int i = 4; 
    i = 9 + 0;; 
    return; 
} 

兩連勝;;。爲什麼這不是一個錯誤?它應該是?根據我的理解,這只是編譯器讀取的「額外的」代碼。這是否浪費表現?另外,如果它真的是空的,爲什麼在返回後我不能有兩個;;? (如return;;)?

編輯:這在實踐中有什麼用處?

+1

在字節碼中丟棄的構造對性能沒有影響。 –

回答

5

爲什麼這不是一個錯誤?

因爲該語言允許您在一行上編寫單個;以表示空行。您可以將;彼此相鄰放置。請參閱JLS §14.6 - Empty Statement

這是浪費的表現嗎?

我不這麼認爲。你不應該爲這樣的錯誤打字而擔心表現。國際海事組織,額外的分號不會讓它到字節碼。所以,沒有運行時性能差異。

而且,如果真的是空的,我爲什麼不能有兩個;;返回後?

您不能在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. 
} 
+0

不錯的正當理由。我看到很多關於爲什麼一個人的「if」陳述失敗的問題,原因是他們有一個「;」緊隨其後。很煩人! –

+1

@StephenD更多的麻煩了一陣子xD – Cruncher

4

在java中,允許使用空白語句。 JLS §14.6 - Empty Statement

你不能做return;;,因爲空白語句將是不可達的代碼,這是不允許的。 JLS 14.21 Unreachable Statements

就浪費性能而言,我相信這會讓您的編譯時間更長一些。但statement;;statement;應該編譯爲相同的字節碼,因此不影響運行時性能。

空白語句也是你必須非常小心你的循環語法的原因。很多時候,我們已經看到了這裏的帖子裏的人有:

while(condition); 
{ 
    //code 
} 

這是一個無限循環,因爲後面的,而空白的聲明,所以它的循環體是空的。