3

finally 블록의 jump 문을 사용하면 안됩니다. 이 간단한 예에서 'break'는 'switch'를 깨는 데 사용됩니다. 수중 음파 탐지기 - 자바와 SonarQube (5.6.3) 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/버그?

+1

'finally'는 정리를위한 것입니다. 네가 거기에 너무 많이 나가는 것 같아. –

+0

답변 해 주셔서 감사합니다. 때로는 청소하는 것이 많습니다. 수중 음파 탐지기의 심층 분석을 위해 코드가 복잡해 졌다고 생각하십니까? 그러면 버그 일 수 있습니다. 이 작은 예조차도 음파 탐지기가 문제를보고하게합니다. finally 블록에서 'break'가 발생하더라도 블록 외부로 점프하지 않아도 문제가 발생하는 것으로 보입니다. – Tester

+0

'finally'블록에서 'switch'가 존재한다고 생각하면 쉽게 버그를 만들 수있는 코드 냄새가 있다고 생각합니다. 반드시 버그입니까? 아뇨,하지만 왜 그걸 필요로합니까? –

답변

2

귀하는 이것이 거짓 긍정이라고 올바르게 말씀하셨습니다. 그러나 이러한 복잡한 논리는 finally 블록에 속하지 않으며 가능한 경우 적절하게 이름이 지정된 정리 메소드로 추출되어야합니다. 이렇게하면 경고가 종료 될뿐만 아니라 코드의 가독성이 향상됩니다.

+1

내가 만들었습니다. SonarJava 분석기의 차기 버전에서 위양성을 처리 할 수있는 티켓. 여기에서 개발을 수행 할 수 있습니다. htt ps : //jira.sonarsource.com/browse/SONARJAVA-2149 –