SonarQube - Java规则"S128" - 为什么规则会抱怨在显然没有必要时会丢失break语句?

Gre*_*egD 13 java sonarqube

我无法弄清楚为什么Sonar一直在抱怨我"没有休息声明"的事实,即使它不需要......

我的开关:

    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.");
    }
}
Run Code Online (Sandbox Code Playgroud)

和声纳一直给我批评:"一个开关声明不包含休息"

为什么是这样?这个开关我不需要休息吗?

我知道这可能是一个特定的案例,但我在网上找不到任何东西.

mus*_*ibs 0

注意:我并不是想回答这个问题。但让我们看看这个特定规则是怎么说的。

规则 S128 说:

Switch case 应以无条件“break”语句结束

当 switch case 结束时没有显式终止执行时,它会继续执行后面 case 的语句。虽然有时这是故意的,但通常是一个错误,会导致意外的行为。

不合规的代码示例

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

合规解决方案

switch (myVariable) {
  case 1:                              
    foo();
    break;
  case 2: 
    doSomething();
    break;
  default:                               
    doSomethingElse();
    break;
}
Run Code Online (Sandbox Code Playgroud)

例外情况

在下列情况下,这一规则可以放宽:

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();
}
Run Code Online (Sandbox Code Playgroud)

参考文献: https ://sonar.spring.io/rules/show/squid:S128?layout=false