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?

+1

'finally'用于清理。看起来你已经有太多的事情要做了。 –

+0

感谢您的回答。有时需要清理很多东西。你认为这会让代码过于复杂,无法通过声纳进行更深入的分析?那么它可能是一个错误。即使这个小例子也会导致声纳报告问题。看起来,finally块中的任何“中断”事件,即使它不会导致跳转到块外的某处,都会导致该问题。 – Tester

+0

我认为'finally'中的'switch'存在一个代码味道,很容易就会产生一个bug,是的。这是否是一个错误?不,但你为什么需要它? –

你是对的,这是一个误报。然而,这样复杂的逻辑不属于finally块,并且如果可能的话应该被提取为恰当命名的清理方法。这不仅会关闭警告,还会提高代码的可读性。

+1

我创建了在未来版本的SonarJava分析仪中处理误报PS://jira.sonarsource.com/browse/SONARJAVA-2149 –