2014-12-15 7 views
5

Sprawdź poniższy kod:Jeśli ostateczny obiekt jest przekazywany, powinno być nadal zaznaczone zero?

@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; 
    } 

Wszystko wydaje się dobrze jednak fakt, że 0 mogą zostać zwrócone na dwóch różnych okazjach warunkowych ma nieco przeszkadza mi. Jeśli ja jednak przenieść zmienne przyporządkowania distance i distance2 do góry, mój IDE ostrzega mnie, że

  if (o == null) 
       return 0; 

byłby wtedy „martwy” kod. Jeśli tak, to czy w tym scenariuszu powinna być sprawdzana wartość null?


Chodzi mi o to:

@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

Ostateczny obiekt może mieć wartość NULL. –

+0

Wartość zwracana 0, gdy jeden obiekt ma wartość NULL, wydaje się błędna, ponieważ obiekty nie są równe. Wolałbym wyjątek w tym przypadku. – Henry

+0

To jest martwy kod, ponieważ 'o.t' powodowałoby' NullPointerException', jeśli 'o' jest puste. Dlatego też czek na wartość zerową nie jest już potrzebny. Jeśli 'o' nie ma wartości NULL, wówczas kontrola również będzie fałszywa i" pomijana ". I tak, powinieneś sprawdzić zero. "NullPointerException" jest tutaj niepotrzebny. – Tom

Odpowiedz

10

końcowy może być null, to po prostu oznacza, że ​​nie można przypisać i jest widoczny w anonimowych klas wewnętrznych itp

w Twoim przypadku, problem jest inny: (patrz komentarze)

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

Tak, to ma sens. Z punktu widzenia programistów, czy przed wywołaniem metody należy sprawdzić "null"? Obecnie przeglądam jakiś stary kod i jestem trochę podekscytowany, czy powinienem całkowicie usunąć ten warunek. – Juxhin

+0

W tym przypadku tej metody nie należy wywoływać bez upewnienia się, że obiekt 'Intersection' ma wartość null – Juxhin

+1

Jeśli masz pewność, że nie będzie wartości NULL, nie ma powodu, aby test był zatrzymany. Możesz również rzucić okiem na to pytanie: http://stackoverflow.com/questions/2858628 – MightyPork

1

Nie jestem do końca pewien, dlaczego uważasz, że nie jest to legalne, albo że to nie może wystąpić, ponieważ parametr jest final:

yourClass.compareTo(null); 

należy zawsze sprawdzić null w scenariuszach, które opierają się na przykład będąc obecny, korzystniej przed użyciem I nstance.

Oznaczenie parametru final uniemożliwia aktywną zmianę referencji lub mutację wartości podczas korzystania z metody; jest to sposób na wyrażenie, że ten kod jest wolny od efektów ubocznych od wartości przekazanej.

Ponadto, zauważam problem z twoją metodą compareTo; jeśli obiektem, który porównujesz jest null, to komparator oznacza go jako odpowiednik. Będziesz także napadał na przypadki o skrajnym poziomie z NaN i ==, ponieważ dwie wartości double mogą nie być równoważne z ,.

Prawdopodobnie chcesz coś takiego zamiast:

@Override 
public int compareTo(final Intersection o) { 

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

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

Jest to odniesienia do obiektu, która jest przekazywana i jako taki może być zerowy lub niezerowy niezależnie od pogody to jest ostateczna, czy też nie.

2

Twój ide ostrzega, ponieważ ostateczna obiekt może być null i można uzyskać wyjątku null pointer na

double distance2 = o.t; 

stąd oświadczenie zwrot lub jakiekolwiek oświadczenie wewnątrz jeśli o == null nigdy nie osiągnie/nie wykona

if (o == null) 
    return 0; 
Powiązane problemy