2010-10-27 14 views
5

Questa verifica è se l'oggetto passato null o no è OK o dovrei usare un tipo di metodo equals()?oggetto! = Verifica nulla

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

risposta

17

preferisco farlo in questo modo:

/** 
* 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. è meno codice per leggere
  2. separa la condizione di errore dalla condizione di attesa (nessun altro = senza trattino)
  3. nessuno ha bisogno di vedere cosa è in linea X per vedere che la variabile della carta era nullo = meno tempo per le persone che cercano di scoprire cosa hanno fatto di sbagliato.
  4. non c'è bisogno di ingombrare il codice con inutili lanci dichiarazioni - si dovrebbe Javadoc, però con una clausola @throws

Oltre a questo, si sta facendo nel modo giusto, a mio parere.

+0

Grazie per i vostri commenti. Non sono sicuro se ho ottenuto la quarta dichiarazione. Vuoi dire che non devo lanciare un'eccezione qui? – Eugene

+0

@AndroidNoob - Devi lanciare l'eccezione, non devi semplicemente * dichiarare * che la lanci. 'public void addCard (Card card)' di per sé è sufficiente, perché IllegalArgumentException è una RuntimeException. –

+0

Ah ok, capito, grazie! – Eugene

3

Come si sta confrontando il riferimento è necessario utilizzare !=. L'utilizzo di equals genererà un'eccezione.

1

Se si desidera verificare se le schede aggiunte non sono null, il codice funzionerà correttamente. Devi solo assicurarti di gestire lo IllegalArgumentException quando chiami addCard.

+4

Non si dovrebbe gestire l'eccezione - si dovrebbe semplicemente evitare di passare in null. IllegalArgumentException dovrebbe quasi * non * essere catturato in modo esplicito. –

+0

Questo è un buon punto. Il mio punto principale era che sarebbe bastato un assegno per convalidare.Penso che di solito è meglio gestire queste eccezioni in modo che l'utente non veda un'applicazione in crash, ma dipende dalla situazione. –

21

Questo è corretto, ma personalmente lo strutturerei al contrario. E 'comune per convalidare argomenti all'inizio del metodo, e poi usarli per il resto del metodo sapendo che sono corretto:

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

Il vantaggio di fare tutti i test argomento up-front è che se un viene passato un argomento non valido, si genera un'eccezione prima che si verifichino effetti collaterali - piuttosto che a metà del metodo, che potrebbe lasciare l'oggetto in uno stato non valido. Naturalmente in questo caso non importa, ma io favorire la coerenza qui :)

Si noti che non c'è bisogno di dichiarare IllegalArgumentException - è una sottoclasse di RuntimeException, che significa che è deselezionata (non è necessario di dichiararla).

+0

+1: avere i test in cima è anche una sorta di documentazione –

5

È possibile utilizzare la classe commons-langValidate. Si rende il codice più breve e più semplice:

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

si getterà un IllegalArgumentException con un messaggio di default (è possibile passare un messaggio personalizzato come secondo argomento, se vi piace)

+0

o Contratti se in C# 4 – Squirrel

6

Effective Java da Josh Blosh raccomanda il seguente:

/** 
* 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); 
    } 

Quindi, in primo luogo non si dichiara il RuntimeException. In secondo luogo lanci una NullPointerException perché il tuo argomento non è semplicemente errato - è nullo. In terzo luogo, si specificano gli argomenti in javadoc, possono essere nulli o meno.

+0

Mi piace di più. – OscarRyz

+3

Una NullPointerException è sempre un bug. A IllegalArgumentException è migliore. – Horcrux7

+0

@ Horcrux7: Joshua Bloch non è d'accordo con te e il passaggio di un valore 'null' al metodo addCard ** è ** un bug, come documentato nel contratto del metodo - tramite l'istruzione @param" Can not be null " –

Problemi correlati