2010-03-25 19 views
47

Prendete questo metodoQuale eccezione da lanciare quando manca un parametro/dipendenza importante?

/** 
* @return List of group IDs the person belongs to 
* 
*/ 
public List<String> getGroups() { 
    if (this.getId().equals("")) return null; 
} 

Vorrei lanciare un'eccezione, invece di tornare nulla, qual è l'eccezione da generare quando un importante parametro/dipendenza non è stato impostato?

+6

Questo codice genererà un NPE se 'getID()' restituisce null. Sarebbe meglio usare 'if (" ".equals (this.getId())) ...' –

+0

Ho quello definito in una classe astratta e c'è un try catch all'interno, e restituirà una stringa vuota in caso di fallimento. – Pentium10

risposta

71

Vorrei utilizzare IllegalArgumentException se il parametro/argomento è controllato dall'esterno o IllegalStateException se il metodo viene chiamato in un momento errato (stato). Nel tuo caso specifico penso che sia il secondo. Un'alternativa (dubbia) è NullPointerException.

Questo dovrebbe tuttavia essere esplicitamente documentato nello @throws in modo che l'utente ne capisca il motivo.

+0

Il contesto della domanda è davvero limitato. Per quanto posso vedere, l'ISE è la scelta migliore. Ho anche dichiarato esplicitamente che, quindi, non vedo come ciò sia male :) – BalusC

+0

C'è una magia come posso aggiornare la sezione commenti in Eclipse per rigenerare automaticamente @params mancanti e aggiungere la sezione @throws? Forse una scorciatoia? – Pentium10

+0

Mi dispiace, non lo so. Verrà automaticamente aggiunto per eccezioni non di runtime (quando si genera/aggiorna la clausola 'throws'), ma non per le eccezioni di runtime. – BalusC

2

Vorrei utilizzare un IllegalStateException perché l'id è lo stato del proprietario. Se l'id fosse passato come parametro, una IllegalArgumentException sarebbe giusta.

0

vorrei creare la mia propria Tipo di eccezione estendendo Exception. In questo modo, le funzioni di chiamata possono catturare quella particolare Eccezione e gestirla in modo appropriato. Nota, puoi fare la stessa cosa con qualsiasi cosa estenda Exception, ma preferisco creare le mie classi Exception in modo da poter essere molto robusto nella mia gestione delle eccezioni. Questo, naturalmente, dipende da te.

+0

Perché reinventare la ruota? IllegalArgumentException è fatto esattamente per un argomento illegale. –

+0

Dipende dal numero di diversi tipi di argomenti illegali che vuoi catturare. Mi piace estendere Excpetion, o in questo caso IllegalArgumentException solo per avere una specifica classe Exception per affrontare i diversi tipi di condizioni che voglio trattare. Rende l'elaborazione delle eccezioni più facile e più robusta, IMHO. -Jay – Jay

2

Se non è possibile garantire che l'ID sia sempre impostato (richiedendolo nel costruttore ad esempio, dove è possibile verificare che sia passato un ID valido), allora penso che gli altri suggerimenti per lanciare IllegalStateException siano corretti. Ma sarebbe meglio cercare di assicurarti che il tuo oggetto non possa entrare in questo stato in primo luogo se possibile

1

Invece di lanciare un'eccezione, devi solo restituire una lista vuota. Se una dipendenza/parametro non viene soddisfatta, non ci sono risultati. Dai commenti e dal codice postato, sembra che sia il comportamento previsto. Se l'id è vuoto, non ci sono gruppi collegati, quindi una lista vuota.

Problemi correlati