无中断开关
2022-09-01 03:27:17
我有一些开关语句,如下所示。请注意,没有中断。Findbugs 仅在第二个案例语句上报告错误。错误是:Switch 语句发现其中一个事例落入下一个事例的位置。
switch(x) {
case 0:
// code
case 1:
// code
case 2:
// code
}
我有一些开关语句,如下所示。请注意,没有中断。Findbugs 仅在第二个案例语句上报告错误。错误是:Switch 语句发现其中一个事例落入下一个事例的位置。
switch(x) {
case 0:
// code
case 1:
// code
case 2:
// code
}
Findbugs指出,如果第一个代码中有任何代码,那么从一个代码下降到下一个通常不是一个好主意(尽管有时它可以很好地使用)。因此,当它看到第二个而没有时,它会报告错误。case
case
break
例如:
switch (foo) {
case 0:
doSomething();
case 1:
doSomethingElse();
default:
doSomeOtherThing();
}
这是完全有效的Java,但它可能没有达到作者的意图:如果是,所有三个函数,然后运行(按该顺序)。如果 是 ,则仅运行。如果 是任何其他值,则仅运行。foo
0
doSomething
doSomethingElse
doSomeOtherThing
foo
1
doSomethingElse
doSomeOtherThing
foo
doSomeOtherThing
相比之下:
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 或 。大多数工具不会将其标记为可能的编码错误,因为在 之前没有代码,这是一个相当常见的模式。doSomething
foo
0
1
case 0
case 1
我写了这些作为评论,但后来它不可见。我把它们变成一个答案。这实际上是T.J.Crowder答案的延伸。
您可以在此处找到导致 Findbugs 报告错误的相关规则。
您可以通过创建包含以下内容的xml文件来防止Findbugs报告此类错误,例如并使用选项运行该工具。请参阅 Findbugs 上的筛选器。filter.xml
-exclude filter.xml
<FindBugsFilter>
<Match>
<Bug category="PERFORMANCE" />
</Match>
</FindBugsFilter>