2010-10-27 13 views
5

Ist diese Überprüfung, ob das Objekt null übergeben wurde oder nicht, in Ordnung, oder sollte ich eine Art von equals() -Methoden verwenden?object! = Nullverifizierung

public void addCard(Card card) throws IllegalArgumentException { 
     if (card != null){ 
      cardList.add(card); 
     } else { 
      throw new IllegalArgumentException(); 
     } 
    } 

Antwort

17

Ich ziehe es wie dies zu tun:

/** 
* Adds a card to the deck. 
* 
* @param the card to add. 
* @throws IllegalArgumentException if the card is null. 
*/ 
public void addCard(final Card card) 
{ 
    if(card == null) 
    { 
     throw new IllegalArgumentException("card must not be null"); 
    } 

    cardList.add(card); 
} 
  1. es ist weniger Code
  2. es trennt den Fehlerzustand von dem erwarteten Zustand (kein anderes = kein Gedankenstrich)
  3. niemand zu lesen muss sehen, was in Zeile X steht, um zu sehen, dass die Kartenvariable null war = weniger Zeit für Leute, die suchen, um herauszufinden, was sie falsch gemacht haben.
  4. keine Notwendigkeit, den Code mit nutzlosen wirft Aussagen Krempel - Sie können es jedoch mit einem @ throws-Klausel

Anders als das Javadoc sollte, werden Sie es richtig tun, meiner Meinung nach.

+0

Vielen Dank für Ihre Kommentare. Nicht sicher, ob ich die 4. Aussage bekommen habe. Meinst du, ich muss hier keine Ausnahme machen? – Eugene

+0

@AndroidNoob - Sie müssen die Ausnahme auslösen, Sie müssen nicht nur * deklarieren *, dass Sie es werfen. 'public void addCard (Card card)' allein genügt, da IllegalArgumentException eine RuntimeException ist. –

+0

Ah ok, hab es, danke! – Eugene

3

Da Sie die Referenz vergleichen, sollten Sie != verwenden. Die Verwendung von equals löst eine Ausnahme aus.

1

Wenn Sie nur überprüfen möchten, ob die hinzugefügten Karten nicht null sind, funktioniert Ihr Code einwandfrei. Sie müssen nur sicherstellen, dass Sie mit IllegalArgumentException umgehen, wenn Sie addCard aufrufen.

+4

Sie sollten die Ausnahme nicht behandeln - Sie sollten es einfach vermeiden, null einzugeben. IllegalArgumentException sollte eigentlich * nie * explizit abgefangen werden. –

+0

Das ist ein guter Punkt. Mein Hauptpunkt war, dass dies ausreichen würde, um zu überprüfen.Ich denke nur, dass es normalerweise besser ist, diese Ausnahmen zu behandeln, damit der Benutzer keine abstürzende Anwendung sieht, aber es hängt von der Situation ab. –

21

Das ist richtig, aber persönlich würde ich es anders herum strukturieren. Es ist üblich, Argumente zu Beginn des Verfahrens zu überprüfen und sie dann für den Rest des Verfahrens verwenden sie richtig sind zu wissen:

public void addCard(Card card) { 
    if (card == null) { 
     throw new IllegalArgumentException("Attempt to add null card"); 
    } 
    cardList.add(card); 
} 

Der Vorteil dabei all das Argument Prüfung up-front ist, dass, wenn ein Ungültiges Argument wird an Sie übergeben, Sie werden eine Ausnahme auslösen, bevor irgendwelche Nebenwirkungen aufgetreten sind - und nicht die Hälfte der Methode, wodurch das Objekt in einem ungültigen Zustand bleiben könnte. Natürlich in diesem Fall spielt keine Rolle, aber ich bevorzuge Konsistenz hier :)

Beachten Sie, dass gibt es keine Notwendigkeit IllegalArgumentException zu erklären - es ist eine Unterklasse von RuntimeException, die es nicht markiert bedeutet (Sie müssen es nicht zu erklären,).

+0

+1: mit den Tests an der Spitze ist auch eine Art von Dokumentation –

5

Sie können commons-langValidate Klasse verwenden. Es macht den Code kürzer und einfacher:

public void addCard(Card card) { 
    Validate.notNull(card); 
    cardList.add(card); 
} 

Es wird eine IllegalArgumentException mit einer Standardmeldung werfen (Sie eine benutzerdefinierte Nachricht als zweites Argument übergeben können, wenn Sie mögen)

+0

Oder Verträge, wenn Sie in C# 4 – Squirrel

6

Effective Java von Josh Blosh empfiehlt Folgendes:

/** 
* ads a card to card list. 
* 
* @param card card to add. Can not be null 
* 
*/ 
public void addCard(Card card) { 
     if (card == null) { 
      throw new NullPointerException("Card can not be null") 
     } 
     cardList.add(card); 
    } 

Also, zuerst deklarieren Sie nicht die RuntimeException. Zweitens werfen Sie eine NullPointerException, weil Ihr Argument nicht einfach falsch ist - es ist null. Drittens geben Sie die Argumente in Javadoc an, können sie null sein oder nicht.

+0

Ich mag es besser. – OscarRyz

+3

Eine NullPointerException ist immer ein Fehler. Eine IllegalArgumentException ist besser. – Horcrux7

+0

@ Horcrux7: Joshua Bloch stimmt nicht mit Ihnen überein, und die Übergabe einer 'Null' an die AddCard-Methode ** ist ** ein Fehler, wie im Methodenvertrag dokumentiert ist - über die @ Param-Anweisung "Kann nicht null sein" –

Verwandte Themen