切换不间断
我有一些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,但它可能不符合作者的意图:如果foo
为0
,则所有三个函数doSomeOtherThing
运行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上的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与任何其他情况不匹配,它将触发。