2015-06-30 14 views
11

Gerçekten bilemiyorum ..SonarQube - Java kuralı "S128" - Kural neden gerekli olmadığında bir break ifadesinin eksik olduğu konusunda neden şikayet ediyor? Sonar Ben İhtiyaç olmadığında bile "break ifadesinin yok" gerçeği şikayet tutar neden

My anahtarı:

public static String lookupVoyageId(String referenceNumber, String sender) { 
    switch (sender) { 
     case "400_HGENT": 
     case "200_HAPEN": 
     case "500_HOOST": 
      Preconditions.checkArgument(referenceNumber.contains("-")); 
      return referenceNumber.split("-")[0]; 
     case "600_HZEEB": 
      Preconditions.checkArgument(referenceNumber.length() >= 6); 
      return referenceNumber.substring(0, 6); 
     case "800_BVL": 
      throw new TransferException("This reference number for IBIS isn't according to the requirements. Can't implement it yet."); 
     case "MCCD": 
      throw new TransferException("This reference number for MCCD isn't according to the requirements. Can't implement it yet."); 
     default: 
      throw new TransferException("The sender (" + sender + ") couldn't be identified."); 
    } 
} 

ve sonar Bana kritik önem veriyor: "Bir anahtar deyimi bir ara vermiyor"

Neden bu? Bu anahtarda herhangi bir molaya ihtiyacım yok mu?

Özel bir durum olabileceğini biliyorum, ancak web'de hiçbir şey bulamıyorum.

+1

Hangi hat için hata veriyorsunuz? Düşüş vakaları için değil mi? Şahsen, orada bir '// düşme' yorumunu görmek isterdim, ama Sonar'ın bundan şikayetçi olduğu konusunda şüphem yok ... –

+0

@Slanec Sadece anahtarın ilk satırında.Ve aynı geçişi, başka bir anahtarda düşmeden geçiriyorum. – GregD

+4

@Slanec Aslında, yorum uyarıyı çok iyi düzeltebilir. Http://stackoverflow.com/questions/5479019/is-sonar-replacement-for-checkstyle-pmd-findbugs göre sonar diğer libs, checkstyle arasında kullanır. Ve checkstyle (http://checkstyle.sourceforge.net/config_coding.html#FallThrough) düşmek istendiğinde bir yorum bekler. – Magnilex

cevap

1

Not: Soruyu yanıtlamaya çalışmıyorum. Ama bu özel kuralın ne söylediğini görelim.

Kural S128 diyor ki: yürütme açıkça anahtar davanın sonunda sona değilken

Anahtarı vakası koşulsuz "mola" ifadesi

bitmelidir Aşağıdaki durumun ifadelerini yürütmeye devam eder. Bu bazen kasıtlıyken, genellikle beklenmedik davranışlara neden olan hatadır.

Uyumsuz Kod Örneği

switch (myVariable) { 
    case 1:        
    foo(); 
    break; 
    case 2: // Both 'doSomething()' and 'doSomethingElse()' will be executed. Is it on purpose ? 
    doSomething(); 
    default:        
    doSomethingElse(); 
    break; 
} 

Uyumlu Çözüm

switch (myVariable) { 
    case 1:        
    foo(); 
    break; 
    case 2: 
    doSomething(); 
    break; 
    default:        
    doSomethingElse(); 
    break; 
} 

İstisnalar

Bu kural fo rahat llowing vakalar:

switch (myVariable) { 
    case 0: // Empty case used to specify the same behavior for a group of cases. 
    case 1:        
    doSomething(); 
    break; 
    case 2: // Use of return statement 
    return; 
    case 3: // Use of throw statement 
    throw new IllegalStateException(); 
    default: // For the last case, use of break statement is optional 
    doSomethingElse(); 
} 

Referanslar:https://sonar.spring.io/rules/show/squid:S128?layout=false

+0

Bu gerçekten OP'nin sorununa bir cevap ya da çözüm değildir… –

+0

Bu bir cevaptır. Açıkçası, sonarqube ağlıyor, çünkü düşmeyi kullanmak yaygın değil. Ama bu sarı alıntı içindeki ikinci cümlede yazılmıştır. – Koshinae

0

amaçlandığı gibi kod parçacığı çalışıp çalışmadığını Sonar bilemez. Uygulamanızın iş mantığını anlayamaz, bu nedenle kodunuzun olduğu gibi çalıştığını bilmezsiniz.

Sonar nedir, bu desenin (yani, düşme ifadeleri arasında geçiş) hata bulmak zor bir ortak kaynak olduğunu bilir. Bu nedenle, Sonar kod kalitesinde bir araç olarak yaygın hataların azaltılması hedefinin bir parçası olarak bu şekilde çalışmayı cesaretlendiriyor.

İlgili konular