2014-12-15 8 views
5

Controlla per il seguente codice:Se viene passato l'oggetto finale, dovrebbe essere ancora nullo il controllo?

@Override 
    public int compareTo(final Intersection o) { 
     if (o == null) 
      return 0; 

     double distance = t; 
     double distance2 = o.t; 

     if (distance == distance2) 
      return 0; 


     return distance2 > distance ? -1 : 1; 
    } 

Tutto sembra ben tuttavia il fatto che 0 possono essere restituiti in due diverse occasioni condizionali fa un po 'mi preoccupa. Se io invece spostare le assegnazioni delle variabili di distance e distance2 verso l'alto, il mio IDE mi avverte che

  if (o == null) 
       return 0; 

sarebbe allora il codice 'morto'. Se questo è il caso, dovrebbe essere nullo anche essere controllato in questo scenario?


Quello che voglio dire è:

@Override 
    public int compareTo(final Intersection o) { 

     double distance = t; 
     double distance2 = o.t; 

     if (o == null) 
      return 0; 

     if (distance == distance2) 
      return 0; 


     return distance2 > distance ? -1 : 1; 
    } 
+0

Un oggetto finale può essere nullo. –

+0

il valore restituito 0 quando un oggetto è nullo sembra sbagliato in quanto gli oggetti non sono uguali. Preferirei un'eccezione in questo caso. – Henry

+0

È un codice morto, perché 'o.t' innescherebbe un' NullPointerException' se 'o' è nullo. Quindi il controllo per null non è più necessario. Se 'o' non è nullo, allora il controllo sarebbe anche falso e" saltato ". E sì, dovresti controllare per null. A 'NullPointerException' non è necessario qui. – Tom

risposta

10

finale può essere nullo, significa solo che non può essere assegnato ed è visibile in classi interne anonime ecc

Nel tuo caso, il problema è diverso: (vedi commenti)

public int compareTo(final Intersection o) { 

    double distance = t; 
    double distance2 = o.t; // here you use it, potentially causing NPE 

    if (o == null) // if o was null, this is never reached 
     return 0; 

    if (distance == distance2) 
     return 0; 


    return distance2 > distance ? -1 : 1; 
} 
+0

Sì, questo ha molto più senso. Dal punto di vista dei programmatori, dovrebbe essere "nullo" prima di invocare il metodo? Attualmente sto rivedendo un vecchio codice e sono un po 'stordito per decidere se rimuovere completamente quella condizione. – Juxhin

+0

In questo caso, questo metodo non dovrebbe essere invocato senza essere sicuro che l'oggetto 'Intersezione' non sia nullo – Juxhin

+1

Se sei abbastanza sicuro che non sarà nullo, non c'è motivo di mantenere il test. Si potrebbe anche voler dare un'occhiata a questa domanda: http://stackoverflow.com/questions/2858628 – MightyPork

1

Non sono del tutto sicuro perché non si pensa che questo è legale, o che questo non può avvenire perché il parametro è final:

yourClass.compareTo(null); 

si dovrebbe sempre verificare la presenza di null in scenari che si basano su l'istanza essere presente, preferibilmente prima di utilizzare l'i nstance.

Contrassegnare il parametro final impedisce di modificare attivamente il riferimento o di mutare il valore mentre si è nel metodo; è un modo per rappresentare che questo codice è privo di effetti collaterali dal valore passato.

Inoltre, noto un problema con il metodo compareTo; se l'oggetto che stai confrontando è null, il comparatore lo indica come equivalente. Si verificheranno anche casi limite con NaN e ==, poiché due valori double potrebbero non corrispondere a esattamente.

probabilmente si desidera qualcosa di simile, invece:

@Override 
public int compareTo(final Intersection o) { 

    double distance = t; 
    double distance2 = o == null ? 0 : o.t; 

    return Double.compare(distance, distance2); 
} 
1

Si tratta di un riferimento a un oggetto che viene passata e come tale può essere nulla o non nullo indipendentemente dal tempo è definitiva o meno.

2

tuo ide si avverte perché un oggetto finale può essere nullo e si può ottenere un'eccezione di puntatore nullo sul

double distance2 = o.t; 

Da qui l'istruzione return o qualsiasi istruzione all'interno del se o == null non raggiungerà mai/eseguire

if (o == null) 
    return 0; 
Problemi correlati