switch ステートメント: ブレーク省略の危険性
Java では、switch ステートメントは複数のケースのオプションを処理する便利な方法を提供します。ただし、break ステートメントを省略すると、微妙なエラーや予期しない動作が発生する可能性があります。静的分析ツールである Findbugs は、そのような発生にフラグを立て、あるケースが次のケースに「落ちた」エラーを報告します。
次のコードを考えてみましょう。
<code class="java">switch(x) { case 0: // code case 1: // code case 2: // code }</code>
Findbugs は、特に次の場合にエラーを発生させます。 2 番目の case ステートメント。これは、break ステートメントがない場合、現在のケースのコードを実行した後、後続のケースに実行がフォールスルーされるためです。
この動作をよりよく理解するために、次の例を見てみましょう。
<code class="java">switch (foo) { case 0: doSomething(); case 1: doSomethingElse(); default: doSomeOtherThing(); }</code>
foo が 0 の場合、doSomething、doSomethingElse、doSomeOtherThing の 3 つの関数がすべてこの順序で実行されます。ただし、foo が 1 の場合は、doSomethingElse と doSomeOtherThing のみが実行されます。この動作は、意図したロジックを反映していない可能性があります。
対照的に、各ケースに Break ステートメントを追加すると、意図した関数のみが確実に実行されます。
<code class="java">switch (foo) { case 0: doSomething(); break; case 1: doSomethingElse(); break; default: doSomeOtherThing(); break; }</code>
このコードでは、1 つの関数のみが実行されます。 foo の値に応じて実行されます。
Findbugs などのツールは、潜在的なエラーを強調表示し、switch ステートメントの意図した動作を保証するためにブレークを省略しました。ただし、特定のケースでは、複数のケースが同じ結果をもたらす連続した値の範囲を表す場合、ブレークを省略することが許容されます。
<code class="java">switch (foo) { case 0: case 1: doSomething(); break; case 2: doSomethingElse(); break; default: doSomeOtherThing(); break; }</code>
このコードは、foo が 0 または 1 の場合に意図的に doSomething を呼び出します。 ほとんどの分析ツールケース間に介在するコードがないため、これはエラーとして報告されません。
以上がFindbugs が Java Switch ステートメントの省略された Break ステートメントにフラグを立てるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。