java switch-statement findbugs

java - Interruptor sin interrupción



switch-statement findbugs (6)

Tengo una declaración de cambio como se muestra a continuación. Note que no hay descanso. Findbugs está reportando un error en la segunda declaración del caso solamente. El error es: Se encontró una instrucción de cambio donde un caso cae al siguiente caso.

switch(x) { case 0: // code case 1: // code case 2: // code }


Escribí esto como comentarios pero luego no es visible. Los estoy convirtiendo en una respuesta. Esto es en realidad una extensión de la respuesta de TJCrowder .

Puede encontrar la regla relacionada que hace que Findbugs informe un error here .

Puede evitar que Findbugs informe este tipo de errores creando un archivo xml con el siguiente contenido, por ejemplo, filter.xml y ejecutando la herramienta con la opción -exclude filter.xml . Ver filtros en Findbugs .

<FindBugsFilter> <Match> <Bug category="PERFORMANCE" /> </Match> </FindBugsFilter>


Findbugs está señalando que caer de un case a otro generalmente no es una buena idea si hay algún código en el primero (aunque a veces se puede usar para un buen efecto). Entonces, cuando ve el segundo case y no hay break , informa del error.

Así, por ejemplo:

switch (foo) { case 0: doSomething(); case 1: doSomethingElse(); default: doSomeOtherThing(); }

Este es un Java perfectamente válido, pero probablemente no hace lo que el autor pretende: si foo es 0 , las tres funciones doSomething , doSomeOtherThing y doSomeOtherThing ejecutan (en ese orden). Si foo es 1 , solo se ejecutan doSomeOtherThing y doSomeOtherThing . Si foo es cualquier otro valor, solo se ejecuta doSomeOtherThing .

A diferencia de:

switch (foo) { case 0: doSomething(); break; case 1: doSomethingElse(); break; default: doSomeOtherThing(); break; }

Aquí, solo una de las funciones se ejecutará, dependiendo del valor de foo .

Ya que es un error de codificación común olvidar el break , las herramientas como Findbugs lo marcan para usted.

Hay un caso de uso común en el que tiene varias declaraciones de case seguidas sin ningún código intermedio:

switch (foo) { case 0: case 1: doSomething(); break; case 2: doSomethingElse(); break; default: doSomeOtherThing(); break; }

Allí, queremos llamar doSomething si foo es 0 o 1 . La mayoría de las herramientas no lo marcarán como un posible error de codificación, porque no hay ningún código en el case 0 antes del case 1 y este es un patrón bastante común.


Los fallos de los conmutadores se incluyen en la categoría de "código dudoso" de Findbugs. Creo que solo marca la primera vez que ocurre una caída en una declaración de cambio para reducir el número de mensajes de error.


Por lo general, a las herramientas de análisis de errores no les gusta el paso en el código porque en la mayoría de los casos, el usuario acaba de olvidar escribir el salto.

No sé si hay una manera de deshabilitar específicamente la advertencia con FindBugs pero la herramienta Checkstyle reconoce comentarios especiales como / * fallthrough * / para asumir que el usuario realmente quiere que se ejecute el siguiente código. Poner este tipo de comentario también mejora la legibilidad. http://checkstyle.sourceforge.net/config_coding.html#FallThrough

La convención de código de Java también menciona el uso de comentarios directos. http://www.oracle.com/technetwork/java/javase/documentation/codeconventions-142311.html


Si sus casos no tienen ruptura, una vez que se trata de un disparador, el interruptor pasará por todos los casos hasta que encuentre una interrupción o el final de los casos. Si tiene un caso predeterminado, se activará si el valor de cambio en este caso foo no coincide con ningún otro caso.


Sin el descanso, caerán uno en el otro, así que si x == 0 todo el código en cada bloque de declaración de caso. Findbugs podría estar equivocado acerca del error, o podría ser una condición de error sin la interrupción, es decir, algo en el case 0 hace que algo en el case 1 rompa.

Sin el código exacto y el error realmente no puedo ayudar más. ¿Es la falta de pausas deliberada?