2010-09-27 9 views
16

Ho una funzione che calcola la media di una lista passata come argomento. Vorrei sapere quale di eccezione Java dovrei buttare quando cerco di calcolare la media di un elenco di dimensioni 0.Quale eccezione lanciare?

public double mean (MyLinkedList<? extends Number> list) 
{ 
    if (list.isEmpty()) 
     throw new ????????; //If I am not mistaken Java has some defined exception for this case 

    //code goes here 
} 

Grazie.

risposta

25

Si può lanciare una new IllegalArgumentException().

Gettato per indicare che un metodo è stato superato un argomento illegale o inappropriato.

Basta non dimenticare di passare un messaggio chiaro come primo argomento. Questo ti aiuterà davvero a capire cosa succede.

Ad esempio "Can not use mean in una lista vuota".

+0

beh, credo che il metodo migliore per trovare le eccezioni da gestire sia quello di interrompere il programma e lasciare che il compilatore java lo dica .. non lo è –

3

È necessario creare una nuova classe che estenda Eccezione e fornisca dettagli specifici del proprio errore. Ad esempio, potresti creare una classe chiamata EmptyListException che contiene i dettagli relativi al tuo errore. Questo potrebbe essere una classe di eccezioni molto semplice che non accetta argomenti di costruzione ma forse chiama super("Cannot generate mean for an empty list"); per fornire un messaggio personalizzato alla traccia dello stack.

Un sacco di volte questo non viene fatto abbastanza ... uno dei miei odori di codice più odiati è quando gli sviluppatori usano un'eccezione generica (a volte anche l'eccezione stessa) e passano un messaggio di stringa nel costruttore. Ciò è valido, ma rende molto più difficile il lavoro di coloro che implementano il tuo codice poiché devono rilevare un'eccezione generica quando in realtà solo poche cose potrebbero accadere. Le eccezioni dovrebbero avere la stessa gerarchia degli oggetti utilizzati per i dati con ciascun livello fornendo dettagli più specifici. Più dettagliata è la classe di eccezioni, più dettagliata e utile è la traccia dello stack.

Ho trovato questo sito: Exceptional Strategies essere molto utile quando si creano eccezioni per le mie applicazioni.

1

Che ne dici di un ArithmeticException - lo stesso dei lanci del runtime.

2

Informazioni su NoSuchElementException. Sebbene IllegalArgumentException potrebbe essere migliore.

1

Attualmente stai lanciando altre eccezioni (o pianificando per?) Qualsiasi delle eccezioni menzionate in precedenza va bene, o semplicemente creane una tua. La cosa più importante è propagare il messaggio di cosa è andato storto.

Se esiste la possibilità che il "catcher" dell'eccezione possa lanciarlo di nuovo, è possibile che si desideri esaminare altre eventuali eccezioni che il "catcher" potrebbe anche lanciare.

7

La domanda da porsi prima è se si dovrebbe essere lanciando a tutti e poi, in tal caso, se dovrebbe essere un'eccezione controllata o non controllata.

Purtroppo, non c'è migliori prassi del settore per decidere queste cose, come mostrato da questo StackOverflow risposta:

In Java, when should I create a checked exception, and when should it be a runtime exception?

Tuttavia, ci sono alcune considerazioni fondamentali:

  • vostro disegno/visione di come dovrebbe funzionare questo metodo (è ragionevole/normale che il metodo venga chiamato con la lista di dimensioni 0)?

  • Coerenza con altri metodi della classe/package

  • conformità con lo standard di codifica applicabile (se presente)

La mia opinione:

  • ritorno Double.NAN o 0 Se chiamare il metodo con un elenco di dimensioni 0 è ragionevole/previsto/normale, avrei dovuto Sider restituisce Double.NAN o 0 se 0 è appropriato per il dominio del problema.

  • Tira un IllegalArgumentException Se il mio progetto dice che il controllo di un elenco vuoto è fortemente la responsabilità del chiamante e la documentazione per il metodo sta per affermare chiaramente che è responsabilità del chiamante, poi ho' d utilizzare lo standard deselezionato IllegalArgumentException.

  • Gettare un personalizzato verificata un'eccezione Se il metodo è parte di un pacchetto di statistiche o una libreria in cui le funzioni diverse statistiche devono affrontare un possibile insieme di dati vuoto, mi piacerebbe che questo sia una condizione di eccezione che fa parte del il dominio del problema. Vorrei creare un'eccezione personalizzata (probabilmente verificata) (ad esempio EmptyDataSetException) per far parte della classe/pacchetto/libreria e utilizzarla in tutti i metodi applicabili. Rendendolo un'eccezione controllata aiuta a ricordare al cliente di considerare come gestire la condizione.

1

Non sono convinto che si debba assolutamente escludere un'eccezione; la media di "niente" è "nulla" o 0 se vuoi. Se il set è vuoto, è sufficiente restituire 0.

Se si DEVE davvero lanciare un'eccezione, quindi IllegalStateException o IllegalArgumentException sono le scelte migliori.

Problemi correlati