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

时间:2015-06-30 10:51:12

标签: 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.");
    }
}

和声纳一直给我批评: “switch语句不包含中断”

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

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

3 个答案:

答案 0 :(得分:1)

如果您无法减少开关箱的数量或无法重构代码,则可以使用

禁止显示警告。
 @SuppressWarnings({"squid:S128", "squid:S1479"}

示例用法here

答案 1 :(得分:0)

注意:我不是想回答这个问题。但是,让我们看看这条特殊规则的含义。

规则S128说:<​​/ em>

切换案例应以无条件“中断”声明结束

  

在交换机结束时未明确终止执行   例如,它继续执行以下案例的陈述。   虽然这有时是故意的,但通常是一个错误导致的   出乎意料的行为。

不符合规范的代码示例

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

合规解决方案

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

<强>例外

在以下情况下放宽此规则:

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();
}

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

答案 2 :(得分:0)

声纳无法知道代码段是否按预期工作。它无法理解您的应用程序的业务逻辑,因此它不知道您的代码假设可以像这样工作。

Sonar 可以知道的是这种模式(即,掉头的switch语句)是难以发现的bug的常见来源。因此,作为代码质量工具的声纳不鼓励以这种方式工作,作为减少常见错误的总体目标的一部分。