Maison >Java >javaDidacticiel >Pourquoi Findbugs signale-t-il les instructions Break omises dans les instructions Java Switch ?
Instructions Switch : les dangers des pauses omises
En Java, les instructions switch offrent un moyen pratique de gérer plusieurs options de cas. Cependant, l'omission des instructions break peut entraîner des erreurs subtiles et un comportement inattendu. Findbugs, un outil d'analyse statique, signale de telles occurrences, signalant les erreurs lorsqu'un cas "passe" au suivant.
Considérez le code suivant :
<code class="java">switch(x) { case 0: // code case 1: // code case 2: // code }</code>
Findbugs génère spécifiquement une erreur sur la deuxième déclaration de cas. En effet, en l'absence d'instruction break, l'exécution passe aux cas suivants après l'exécution du code du cas en cours.
Pour mieux comprendre ce comportement, examinons un exemple :
<code class="java">switch (foo) { case 0: doSomething(); case 1: doSomethingElse(); default: doSomeOtherThing(); }</code>
Si foo vaut 0, les trois fonctions doSomething, doSomethingElse et doSomeOtherThing seront exécutées dans cet ordre. Cependant, si foo vaut 1, seuls doSomethingElse et doSomeOtherThing s'exécuteront. Ce comportement peut ne pas refléter la logique prévue.
En revanche, l'ajout d'instructions break à chaque cas garantit que seule la fonction prévue est exécutée :
<code class="java">switch (foo) { case 0: doSomething(); break; case 1: doSomethingElse(); break; default: doSomeOtherThing(); break; }</code>
Dans ce code, une seule fonction sera être exécuté en fonction de la valeur de foo.
Des outils tels que l'indicateur Findbugs ont omis les pauses pour mettre en évidence les erreurs potentielles et garantir le comportement prévu des instructions switch. Cependant, dans certains cas, il est acceptable d'omettre les ruptures lorsque plusieurs cas représentent une plage contiguë de valeurs avec des conséquences identiques :
<code class="java">switch (foo) { case 0: case 1: doSomething(); break; case 2: doSomethingElse(); break; default: doSomeOtherThing(); break; }</code>
Ce code appelle intentionnellement doSomething lorsque foo vaut 0 ou 1. La plupart des outils d'analyse ne signalerait pas cela comme une erreur puisqu'il n'y a pas de code intermédiaire entre les cas.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!