切换不间断

我有一些switch语句,如下所示。 请注意,没有rest。 Findbugs仅在第二个案例陈述中报告错误。 错误是:在一个案例落到下一个案例的地方找到切换语句。

switch(x) { case 0: // code case 1: // code case 2: // code } 

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

例如:

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

这是完全有效的Java,但它可能不符合作者的意图:如果foo0 ,则所有三个函数doSomeOtherThing运行doSomethingdoSomethingElsedoSomeOtherThingdoSomeOtherThing顺序)。 如果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上的filter 。

      

切换漏洞属于Findbugs类别的“狡猾代码”。 我认为它只标记switch语句中第一次出现的掉落,以减少错误消息的数量。

如果没有中断,它们会相互掉落,所以如果x == 0你将遍历每个case语句块中的所有代码。 Findbugs可能是错误的错误,或者它可能是没有中断的错误条件,即case 0某些内容导致case 1某些内容中断。

没有确切的代码和错误,我无法真正帮助进一步。 故意缺乏rest吗?

通常,错误分析工具不喜欢代码中的漏洞,因为在大多数情况下,用户只是忘记编写中断。

我不知道是否有一种方法可以使用FindBugs专门禁用警告,但Checkstyle工具会识别特殊注释,例如/ * fallthrough * /,以假设用户确实希望执行以下代码。 发表这种评论也可以提高可读性。 http://checkstyle.sourceforge.net/config_coding.html#FallThrough

Java代码约定还提到了使用fallthrough注释。 http://www.oracle.com/technetwork/java/javase/documentation/codeconventions-142311.html

如果您的情况没有中断,一旦案件触发,开关将经历所有情况,直到它找到案件的中断或结束。 如果你有默认情况,如果你在这种情况下的开关值foo与任何其他情况不匹配,它将触发。