无中断开关

2022-09-01 03:27:17

我有一些开关语句,如下所示。请注意,没有中断。Findbugs 仅在第二个案例语句上报告错误。错误是:Switch 语句发现其中一个事例落入下一个事例的位置。

switch(x) {

    case 0:
        // code

    case 1:
        // code

    case 2:
        // code
}

答案 1

Findbugs指出,如果第一个代码中有任何代码,那么从一个代码下降到下一个通常不是一个好主意(尽管有时它可以很好地使用)。因此,当它看到第二个而没有时,它会报告错误。casecasebreak

例如:

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

这是完全有效的Java,但它可能没有达到作者的意图:如果是,所有三个函数,然后运行(按该顺序)。如果 是 ,则仅运行。如果 是任何其他值,则仅运行。foo0doSomethingdoSomethingElsedoSomeOtherThingfoo1doSomethingElsedoSomeOtherThingfoodoSomeOtherThing

相比之下:

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

此处,只有一个函数将运行,具体取决于 的值。foo

由于这是一个常见的编码错误,忘记,像Findbugs这样的工具会为您标记它。break

有一个常见的用例,即您一行中有多个语句,没有干预代码:case

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

在那里,我们想要调用 if is 。大多数工具不会将其标记为可能的编码错误,因为在 之前没有代码,这是一个相当常见的模式。doSomethingfoo01case 0case 1


答案 2

我写了这些作为评论,但后来它不可见。我把它们变成一个答案。这实际上是T.J.Crowder答案的延伸。

您可以在此处找到导致 Findbugs 报告错误的相关规则。

您可以通过创建包含以下内容的xml文件来防止Findbugs报告此类错误,例如并使用选项运行该工具。请参阅 Findbugs 上的筛选器filter.xml-exclude filter.xml

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