Findbugs показывает, что переход от одного case
к следующему, как правило, не очень хорошая идея, если в первом есть какой-либо код (хотя иногда его можно использовать для хорошего эффекта). Поэтому, когда он видит второе case
, а не break
, он сообщает об ошибке.
Так, например:
switch (foo) {
case 0:
doSomething();
case 1:
doSomethingElse();
default:
doSomeOtherThing();
}
Это совершенно правильный Java, но, вероятно, он не выполняет то, что задумал автор: если foo
равно 0
, всех трех функций doSomething
, doSomethingElse
и doSomeOtherThing
запустить (в таком порядке). Если foo
равно 1
, только doSomethingElse
и doSomeOtherThing
работают. Если foo
- любое другое значение, запускается только doSomeOtherThing
.
Для сравнения:
switch (foo) {
case 0:
doSomething();
break;
case 1:
doSomethingElse();
break;
default:
doSomeOtherThing();
break;
}
Здесь будет работать только одна из функций, в зависимости от значения foo
.
Так как забыть о break
- это распространенная ошибка кодирования, такие инструменты, как Findbugs, отмечают ее для вас.
Существует распространенный вариант использования, когда у вас есть несколько case
операторов подряд с no промежуточным кодом:
switch (foo) {
case 0:
case 1:
doSomething();
break;
case 2:
doSomethingElse();
break;
default:
doSomeOtherThing();
break;
}
Там мы хотим позвонить doSomething
, если foo
это 0
или 1
. Большинство инструментов не помечают это как возможную ошибку кодирования, потому что в case 0
до case 1
нет кода, и это довольно распространенный шаблон.