2013-02-22 11 views
7

Il seguente codice mi dà avvertimento di un 'Dead Code' in Eclipse:indesiderati Morto codice di avvertimento in Eclipse

private void add(Node<E> n, E element) { 
     Node<E> e = new Node<E>(element); 
     if (n == null) 
      root = e; 
     else if (n.compareTo(e) > 0) 
      if (n.hasLeft()) 
       add(n.getLeft(), element); 
      else 
       n.setLeft(e); 
     else if (n.hasRight()) 
      add(n.getRight(), element); 
     else 
      n.setRight(e); 
     balance(e); 
    } 

L'avvertimento compare alla riga che dice root = e;.

Ho cercato il codice guasto e ho scoperto che è il codice hat non ha alcun effetto e verrà quindi ignorato dal compilatore java.

Tuttavia, questa radice è un campo privato nella mia classe e pertanto è necessario che la funzione del mio programma lo faccia.

Il compilatore ha intenzione di ignorarlo? Come posso smettere? Perché pensa che sia un codice morto?

+1

è il codice vero? –

+2

Fai un clean e ricostruisci il codice, Eclipse scappa una volta ogni tanto. –

+1

Penso che l'unica volta che questo può accadere è se sarebbe impossibile per root essere nullo. Forse guarda dove viene usata questa variabile. – austin

risposta

2

Se root è un campo privato nella classe che contiene il metodo add hai postato, allora, come hai detto, la linea root = e; non dovrebbe essere considerato il codice morto l'IDE Eclipse.

Il compilatore dovrebbe funzionare correttamente ... è solo un avviso IDE.

La mia ipotesi sarebbe che Eclipse esegua una sorta di code walk (simile a strumenti di complessità ciclomatica) per determinare percorsi di codice e trovare "codice morto" e "codice non raggiungibile".

Vorrei provare a rinfrescare, quindi a pulire e creare l'IDE. Se ciò non lo risolve, Eclipse potrebbe semplicemente avere un "falso positivo" in fase di avviso sul codice morto. Non sarebbe la prima volta ... Io uso entrambi IDEA di Eclipse e IntelliJ e ho visto entrambi gli IDE in modo errato avvertire il codice prima. Tuttavia, il mio codice viene comunque compilato correttamente nonostante l'avviso IDE.

2

Ci sono probabilmente due problemi in corso: primo: il problema è che la radice di linea non è "usata" per nulla. In findbugs lo stesso errore è indicato come un "negozio morto" che, per findbugs significa:

Questa istruzione assegna un valore a una variabile locale, ma il valore non viene letto o utilizzato in qualsiasi istruzione successiva. Spesso, questo indica un errore, perché il valore calcolato non viene mai utilizzato.

nota che la parola chiave qui è "Spesso".

Vorrei verificare e assicurarsi che la radice venga utilizzata come previsto, e se è possibile, come menzionato da Philip Tenn, un falso positivo.

Secondo: il problema può essere correlato a this issue.

1

Poiché la fonte non è sufficiente per individuare la causa esatta, credo che sia correlata ai problemi di eclissi relativi al codice Morto. Alcuni dei problemi è possibile verificare here e here.

0

Controlla la tua condizione.

Node<E> e = new Node<E>(element); 
if (n == null) { 
    // dead code here 
} 

Questo codice è morto a causa n == null sarà sempre essere false. Hai appena creato una nuova istanza di Node<E> sulla riga precedente (incondizionatamente). Un nuovo oggetto non sarà mai nullo.

+0

Nota che ho fatto 'e', ma sto controllando' n'. – golddove

+0

Scusa, ho continuato a guardare l'originale e ho giurato un sacco di volte che ho visto "n" lassù. Forse ero un po 'troppo stanco;) – efritz