Gli errori di compilazione in codice morto sono definiti dal compilatore e non dall'ID. Mentre è vero, il codice non verrà mai eseguito, non viola nessuna delle regole per le dichiarazioni non raggiungibili da Oracle Docs.
Da Unreachable Statements
Questa sezione è dedicata ad una spiegazione precisa della parola "raggiungibile". L'idea è che ci deve essere un possibile percorso di esecuzione dall'inizio del costruttore, del metodo, dell'inizializzatore di istanze o dell'inizializzatore statico che contiene l'istruzione nell'istruzione stessa. L'analisi tiene conto della struttura delle affermazioni. Fatta eccezione per il trattamento speciale di while, do e per le istruzioni la cui espressione condizionale ha il valore costante true, i valori delle espressioni non vengono presi in considerazione nell'analisi del flusso.
Le regole specifiche per questo caso sono relative al fatto se i blocchi che hai creato siano raggiungibili o meno. (iff = if and only if)
Un blocco vuoto che non è un blocco di interruttori può essere completato normalmente se è raggiungibile.
Un blocco non vuoto che non è un blocco di interruzione può essere completato normalmente se l'ultima istruzione in esso può essere completata normalmente.
La prima istruzione in un blocco non vuoto che non è un blocco di commutazione è raggiungibile se il blocco è raggiungibile.
Ogni altra istruzione S in un blocco non vuoto che non è un blocco di commutazione è raggiungibile se l'istruzione che precede S può essere completata normalmente.
Procedimento letsThrow
soddisfa i criteri per un blocco di lavoro di codice e tecnicamente completa normalmente. Genera un'eccezione, ma completa. Indipendentemente dal fatto che lanci o meno un'eccezione garantita non viene presa in considerazione nel determinare se quel blocco di codice nel suo uso effettivo, , solo se è possibile o meno raggiungibile. Nella maggior parte dei casi, il codice morto viene rilevato solo quando include try/catch/returns, che sono la maggior parte delle regole.
Si consideri il seguente, ancora più conciso versione:
@Test
public void testDeadCode() {
System.exit(0);
System.out.println("will never be reached");
}
Non c'è nessun vero contatore per questo parte da un uso diligente di strumenti di copertura, ma il lato positivo nel tuo esempio è vedrete eccezioni garantiti ogni volta tu esegui il codice.
Immaginate la stessa situazione ma con codice molto più complesso nel metodo 'letsThrow()' con molte chiamate di metodo interne. Chiedete al compilatore di controllare il codice morto in questa situazione anche per voi? Il compilatore non è onnipotente. – SimY4
Il modo migliore per sapere è un completo test delle unità e il controllo sulla copertura del codice clover che ti dirà quale codice non viene mai eseguito – Kode
@Vwin Non proprio. Il codice che mi ha fatto chiedere sembra 'catch (Whatever w) {tuneAndRethrow (w); lanciare Bla (w); } 'quindi c'è solo una riga di codice morto. Ciò significa che ho bisogno di una copertura vicina al 100% per tutte le nostre classi per trovare quei posti. Non sembra un vero piano per me. – GhostCat