Switch without break

2019-01-01 09:13发布

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
}

6条回答
只若初见
2楼-- · 2019-01-01 09:51

If your cases don't have break, once a case is trigger switch will go through all cases until it finds a break or end of the cases. If you have default case it will trigger if your switch value in this case foo does not match with any other cases.

查看更多
余欢
3楼-- · 2019-01-01 09:58

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.

查看更多
何处买醉
4楼-- · 2019-01-01 09:58

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>
查看更多
几人难应
5楼-- · 2019-01-01 10:04

Without the break they will fall though into each other so if x == 0 you'll go through all the code in every case statement block. Findbugs could either be wrong about the error, or it could be an error condition without the break, i.e. something in case 0 causes something in case 1 to break.

Without the exact code and error I can't really help further. Is the lack of breaks deliberate?

查看更多
情到深处是孤独
6楼-- · 2019-01-01 10:09

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.

查看更多
听够珍惜
7楼-- · 2019-01-01 10:12

Usually bug analysis tools don't like fallthrough in code because in most cases, the user has just forgotten to write the break.

I don't know if there is a way to specifically disable the warning with FindBugs but Checkstyle tool recognize special comments such as /* fallthrough */ to assume that the user really wants the following code to be executed. Putting this kind of comment also improves readability. http://checkstyle.sourceforge.net/config_coding.html#FallThrough

Java code convention also mentions the use of fallthrough comment. http://www.oracle.com/technetwork/java/javase/documentation/codeconventions-142311.html

查看更多
登录 后发表回答