Switch 語句:省略中斷的危險
在 Java 中,switch 語句提供了一個處理多個 case 選項的便利方法。然而,省略break語句可能會導致微妙的錯誤和意外的行為。 Findbugs 是一種靜態分析工具,它會標記此類事件,並報告一個案例「落入」下一個案例的錯誤。
考慮以下程式碼:
<code class="java">switch(x) { case 0: // code case 1: // code case 2: // code }</code>
Findbugs 特別會在下列情況下引發錯誤:
第二個案例陳述。這是因為,在沒有break語句的情況下,執行目前案例的程式碼後,執行會轉到後續案例。
<code class="java">switch (foo) { case 0: doSomething(); case 1: doSomethingElse(); default: doSomeOtherThing(); }</code>為了更好地理解這種行為,讓我們看一個示例:
如果foo 為0,則所有三個函數doSomething、doSomethingElse 和doSomeOtherThing 將按該順序執行。但是,如果 foo 為 1,則僅執行 doSomethingElse 和 doSomeOtherThing。這種行為可能無法反映預期的邏輯。
<code class="java">switch (foo) { case 0: doSomething(); break; case 1: doSomethingElse(); break; default: doSomeOtherThing(); break; }</code>相反,在每個情況下加入break語句可確保僅執行預期的函數:
在此程式碼中,只有一個函數會被執行依據 foo 的值執行。
<code class="java">switch (foo) { case 0: case 1: doSomething(); break; case 2: doSomethingElse(); break; default: doSomeOtherThing(); break; }</code>Findbugs 等工具標記省略中斷以反白潛在錯誤並確保 switch 語句的預期行為。但是,在某些情況下,當多個情況表示具有相同結果的連續範圍的值時,省略中斷是可以接受的:此程式碼有意在foo 為0 或1 時調用doSomething。大多數分析工具不會將此報告為錯誤,因為案例之間沒有中間代碼。
以上是為什麼 Findbugs 會標記 Java Switch 語句中省略的 Break 語句?的詳細內容。更多資訊請關注PHP中文網其他相關文章!