Switch without break
I have some switch statement as shown below. Notice there is no break. Findbugs is reporting error on the second case statement only. The error is : Switch statement found where one case falls through to the next case.
switch(x) {
case 0:
// code
case 1:
// code
case 2:
// code
}
Solution 1:
Findbugs is flagging up that falling through from one case
to the next is generally not a good idea if there's any code in the first one (although sometimes it can be used to good effect). So when it sees the second case
and no break
, it reports the error.
So for instance:
switch (foo) {
case 0:
doSomething();
case 1:
doSomethingElse();
default:
doSomeOtherThing();
}
This is perfectly valid Java, but it probably doesn't do what the author intended: If foo
is 0
, all three of the functions doSomething
, doSomethingElse
, and doSomeOtherThing
run (in that order). If foo
is 1
, only doSomethingElse
and doSomeOtherThing
run. If foo
is any other value, only doSomeOtherThing
runs.
In contrast:
switch (foo) {
case 0:
doSomething();
break;
case 1:
doSomethingElse();
break;
default:
doSomeOtherThing();
break;
}
Here, only one of the functions will run, depending on the value of foo
.
Since it's a common coding error to forget the break
, tools like Findbugs flag it up for you.
There's a common use-case where you have multiple case
statements in a row with no intervening code:
switch (foo) {
case 0:
case 1:
doSomething();
break;
case 2:
doSomethingElse();
break;
default:
doSomeOtherThing();
break;
}
There, we want to call doSomething
if foo
is 0
or 1
. Most tools won't flag this up as a possible coding error, because there's no code in the case 0
prior to the case 1
and this is a fairly common pattern.
Solution 2:
I wrote these as comments but then it's not visible. I'm turning them into an answer. This is actually an extension to T.J.Crowder's answer.
You can find the related rule that causes Findbugs to report an error here.
You can prevent Findbugs to report this kind of errors by creating an xml file with the following content, say filter.xml
and running the tool with -exclude filter.xml
option. See filters on Findbugs.
<FindBugsFilter>
<Match>
<Bug category="PERFORMANCE" />
</Match>
</FindBugsFilter>
Solution 3:
Switch fall-throughs fall under the Findbugs category of "dodgy code". I think it only flags the first occurrence of a fall-through in a switch statement to cut down on the number of error messages.