Findbugs segnala che il passaggio da uno case
a quello successivo non è generalmente una buona idea se c'è un codice nel primo (anche se a volte può essere utilizzato con buoni risultati). Quindi, quando vede il secondo case
e n. break
, segnala l'errore.
Così, per esempio:
switch (foo) {
case 0:
doSomething();
case 1:
doSomethingElse();
default:
doSomeOtherThing();
}
Ciò è perfettamente valido Java, ma probabilmente non fa quello che l'autore intendeva: se foo
è 0
, tutti e tre le funzioni doSomething
, doSomethingElse
, e doSomeOtherThing
run (in questo ordine). Se foo
è 1
, eseguire solo doSomethingElse
e doSomeOtherThing
. Se foo
è un qualsiasi altro valore, viene eseguito solo doSomeOtherThing
.
Al contrario:
switch (foo) {
case 0:
doSomething();
break;
case 1:
doSomethingElse();
break;
default:
doSomeOtherThing();
break;
}
Qui, una sola delle funzioni verrà eseguito, a seconda del valore di foo
.
Poiché si tratta di un errore di codifica comune per dimenticare lo break
, gli strumenti come Findbugs lo segnalano.
C'è un caso d'uso comune in cui si dispone di più case
dichiarazioni di fila con senza intervenendo codice:
switch (foo) {
case 0:
case 1:
doSomething();
break;
case 2:
doSomethingElse();
break;
default:
doSomeOtherThing();
break;
}
Lì vogliamo chiamare doSomething
se foo
è 0
o1
. La maggior parte degli strumenti non contrassegnerà questo come un possibile errore di codifica, perché non è presente alcun codice nello case 0
precedente allo case 1
e questo è uno schema abbastanza comune.
fonte
2011-12-19 16:05:32
cosa dice il messaggio di errore? –
E il problema è ...? – fge
Sei sicuro che non sia un avvertimento piuttosto che un errore? – xagyg