2017-02-27 75 views
3

我知道,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,是的。這是否是一個錯誤?不,但你爲什麼需要它? –

回答

2

你是對的,這是一個誤報。然而,這樣複雜的邏輯不屬於finally塊,並且如果可能的話應該被提取爲恰當命名的清理方法。這不僅會關閉警告,還會提高代碼的可讀性。

+1

我創建了在未來版本的SonarJava分析儀中處理誤報PS://jira.sonarsource.com/browse/SONARJAVA-2149 –