我无法弄清楚为什么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)
和声纳一直给我批评:"一个开关声明不包含休息"
为什么是这样?这个开关我不需要休息吗?
我知道这可能是一个特定的案例,但我在网上找不到任何东西.
注意:我并不是想回答这个问题。但让我们看看这个特定规则是怎么说的。
规则 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