ホームページ  >  記事  >  Java  >  Findbugs が Java Switch ステートメントの省略された Break ステートメントにフラグを立てるのはなぜですか?

Findbugs が Java Switch ステートメントの省略された Break ステートメントにフラグを立てるのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-29 11:42:02687ブラウズ

  Why Does Findbugs Flag Omitted Break Statements in Java Switch Statements?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。