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
в строке с никаким промежуточным кодом:
switch (foo) {
case 0:
case 1:
doSomething();
break;
case 2:
doSomethingElse();
break;
default:
doSomeOtherThing();
break;
}
Там мы хотим вызвать doSomething
, если foo
равно 0
или 1
. Большинство инструментов не пометят это как возможную ошибку кодирования, потому что в case 0
нет кода до case 1
, и это довольно распространенный шаблон.
person
T.J. Crowder
schedule
19.12.2011