SonarQube,在finally块中跳转语句(squid:S1143)
问题描述:
我知道,finally语句中的跳转语句不应该被使用。在这个简单的例子中,'break'用来打破'switch'。 SonarQube(5.6.3)与 声纳的Java 4.5.0.8398报告的一个问题:SonarQube,在finally块中跳转语句(squid:S1143)
终于 “跳转语句不应该发生 ”“ 块(鱿鱼:S1143)”
public static void breakInFinallyIssue(){
int a = 0;
try{
a = 1/0;
}catch(Exception x){
System.out.println("div by zero");
}
finally{
switch (a) {
case 0:
//do something
break;
default:
break;
}
//do something more
}
}
这是一个已知的FP/bug?
答
你是对的,这是一个误报。然而,这样复杂的逻辑不属于finally块,并且如果可能的话应该被提取为恰当命名的清理方法。这不仅会关闭警告,还会提高代码的可读性。
+1
我创建了在未来版本的SonarJava分析仪中处理误报PS://jira.sonarsource.com/browse/SONARJAVA-2149 –
'finally'用于清理。看起来你已经有太多的事情要做了。 –
感谢您的回答。有时需要清理很多东西。你认为这会让代码过于复杂,无法通过声纳进行更深入的分析?那么它可能是一个错误。即使这个小例子也会导致声纳报告问题。看起来,finally块中的任何“中断”事件,即使它不会导致跳转到块外的某处,都会导致该问题。 – Tester
我认为'finally'中的'switch'存在一个代码味道,很容易就会产生一个bug,是的。这是否是一个错误?不,但你为什么需要它? –