无中断地切换

我有一些switch语句如下所示。 注意没有休息。 Findbugs仅在第二个case语句中报告错误。 错误是:在一种情况下发生的切换语句到达下一种情况。

switch(x) {

    case 0:
        // code

    case 1:
        // code

    case 2:
        // code
}

如果在第一个代码中有任何代码(尽管有时它可以用来产生良好效果),Findbugs正在标记从一种case到另一种case下降通常不是一个好主意。 因此,当它看到第二个case并且没有break ,它会报告错误。

举例来说:

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

这是完全有效的Java,但它可能不符合作者的意图:如果foo0 ,则所有三个函数doSomethingdoSomethingElsedoSomeOtherThing运行( doSomeOtherThing顺序)。 如果foo1 ,则只运行doSomethingElsedoSomeOtherThing 。 如果foo是任何其他值,则只运行doSomeOtherThing

相反:

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

在这里,只有一个函数会运行,具体取决于foo的值。

由于忘记break是一种常见的编码错误,因此Findbugs等工具会将其标记出来。

有一个常见的使用案例,您可以连续使用多个case语句而不需要插入代码:

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

在那里,如果foo0 1 ,我们想调用doSomething 。 大多数工具不会将其标记为可能的编码错误,因为在case 1之前case 0没有代码,并且这是相当常见的模式。


我把这些作为评论写下来,但是不可见。 我正在把他们变成一个答案。 这实际上是TJCrowder答案的延伸。

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

您可以通过创建一个带有以下内容的xml文件来阻止Findbugs报告这类错误,例如filter.xml并使用-exclude filter.xml选项运行该工具。 查看Findbugs上的过滤器。

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

Findbugs类别的“狡猾代码”属于切换过程。 我认为它只标记了在switch语句中第一次出现fall-through,以减少错误消息的数量。

链接地址: http://www.djcxy.com/p/84469.html

上一篇: Switch without break

下一篇: C# switch/break