Findbugs sygnalizuje, że przechodzenie z jednego case
do następnego nie jest dobrym pomysłem, jeśli w pierwszym jest jakikolwiek kod (chociaż czasami można go wykorzystać do dobrego efektu). Więc gdy widzi drugi case
i nie break
, zgłasza błąd.
Tak na przykład:
switch (foo) {
case 0:
doSomething();
case 1:
doSomethingElse();
default:
doSomeOtherThing();
}
To jest całkowicie poprawny Java, ale to chyba nie robi tego, co autor ma: Jeśli foo
jest 0
, wszystkie trzy funkcji doSomething
, doSomethingElse
i doSomeOtherThing
uruchom (w tej kolejności). Jeśli foo
jest 1
, działają tylko doSomethingElse
i doSomeOtherThing
. Jeśli foo
ma jakąkolwiek inną wartość, działa tylko doSomeOtherThing
.
W przeciwieństwie:
switch (foo) {
case 0:
doSomething();
break;
case 1:
doSomethingElse();
break;
default:
doSomeOtherThing();
break;
}
Tutaj tylko jedna z funkcji będzie działać, w zależności od wartości foo
.
Ponieważ jest to typowy błąd kodowania, aby zapomnieć o break
, narzędzia takie jak Findbugs podnoszą to za Ciebie.
Jest częstym use-case gdzie masz kilka case
oświadczenia w jednym rzędzie z nie kod interwencyjnym:
switch (foo) {
case 0:
case 1:
doSomething();
break;
case 2:
doSomethingElse();
break;
default:
doSomeOtherThing();
break;
}
Nie chcemy zadzwonić doSomething
jeśli foo
jest 0
lub1
. Większość narzędzi nie sygnalizuje tego jako możliwego błędu kodowania, ponieważ nie ma kodu w case 0
przed case 1
i jest to dość powszechny wzorzec.
co mówi komunikat o błędzie? –
A problemem jest ...? – fge
Czy na pewno nie jest to ostrzeżenie, a nie błąd? – xagyg