无中断地切换
我有一些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,但它可能不符合作者的意图:如果foo
为0
,则所有三个函数doSomething
, doSomethingElse
和doSomeOtherThing
运行( doSomeOtherThing
顺序)。 如果foo
是1
,则只运行doSomethingElse
和doSomeOtherThing
。 如果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;
}
在那里,如果foo
是0
或 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