我无法弄清楚为什么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语句不包含中断”
这是为什么?这个开关我不需要休息吗?
我知道这可能是一个特例,但我在网上找不到任何东西。
答案 0 :(得分:1)
答案 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的常见来源。因此,作为代码质量工具的声纳不鼓励以这种方式工作,作为减少常见错误的总体目标的一部分。