2014-12-18 2 views
10

Recentemente, ho avuto un colloquio con la compagnia e mi hanno dato un problema di codifica. Mi è stato dato un programma relativo al mazzo di carte e uno dei metodi era mescolare il mazzo di carte. Così ho scritto il programma come:Quando lanciare un'eccezione di runtime?

/** Shuffle the list of cards so that they are in random order 
* @param d Deck of cards*/ 
public static void shuffle(Deck d) 
{ 
    if(d == null) 
     throw new IllegalArgumentException(); 
    Random randomGenerator = new Random(); 
    List<Card> cards = d.getDeckOfCards(); // cards is basically Linked List.. cards = new LinkedList<Cards>() 
    for(int i=0;i<cards.size();i++) 
    { 
     int randomNumber = randomGenerator.nextInt(52); 
     Card c1 = cards.remove(randomNumber); 
     Card c2 = cards.remove(0); 
     cards.add(0, c1); 
     cards.add(randomNumber,c2); 
    }  

} 

Nel codice di cui sopra, ho gettato IllegalArgumentException cui sono più dubbi su. In quali condizioni dovrebbe effettivamente generare un'eccezione di runtime? Dovremmo effettivamente lanciare un'eccezione di runtime?

Grazie

+0

"Nel codice precedente, ho lanciato IllegalArgumentException di cui sono più dubbioso". Vuoi dire 'gettare nuovo IllegalArgumentException();'? – motoku

+2

Non vedo nulla di sbagliato con "fallire presto" qui lanciando un 'IllegalArgumentException', soprattutto perché il passaggio di 'null' non sarebbe valido. Probabilmente prenderei in considerazione l'uso della versione di "IllegalArgumentException" che accetta un 'String' per descrivere cosa è andato storto. Se shuffle fosse un metodo della classe Deck che eliminerebbe qualsiasi necessità di verificare la presenza di null. –

+0

Dal [javadoc] (http://docs.oracle.com/javase/7/docs/api/java/lang/IllegalArgumentException.html): * IllegalArgumentException: generato per indicare che un metodo è stato passato illegale o inappropriato argomento * –

risposta

23

Dovremmo effettivamente lanciare un'eccezione di runtime?

Sì, dovremmo. Le eccezioni di runtime hanno uno scopo specifico: segnalano problemi di programmazione che possono essere risolti solo cambiando il codice, anziché modificare l'ambiente in cui viene eseguito il programma.

In quali condizioni deve effettivamente generare un'eccezione di runtime?

Quando si rileva un errore nel modo in cui la classe o il metodo viene utilizzato, genera un'eccezione di runtime.

In generale, ci sono due categorie di situazioni in cui è necessario lanciare un'eccezione di runtime:

  • Passando parametro non valido valori - Questa è la causa più comune di eccezioni di runtime. La maggior parte delle eccezioni di validazione dei parametri dovrebbe essere eccezioni di runtime. Java fornisce diverse sottoclassi per segnalare questi problemi specifici.
  • Chiamare i metodi in una sequenza errata - Questa è un'altra causa comune. Quando non è possibile chiamare determinati metodi fino a quando una classe non termina l'inizializzazione o alcuni altri passaggi preparatori, le chiamate al momento sbagliato dovrebbero causare eccezioni di runtime.

In questo senso, il codice va bene: si adatta perfettamente alla prima categoria, cioè passando valori di parametro non validi. Una cosa che farei in modo leggermente diverso è aggiungere un messaggio per dire quale parametro ha un valore non valido, ma nel tuo caso non è critico, perché lì c'è solo un parametro.

8

IllegalArgumentException is, in fact, a subclass of RuntimeException.

È meglio essere un po 'più specifici, per aiutare altri programmatori in futuro. Preferirei decisamente lo IllegalArgumentException perché descrive meglio cosa è andato storto, ma in realtà, uno di questi funzionerebbe.

+0

L'unica risposta corretta è imho poiché indica che 'IllegalArumentException' è una' RuntimeException' .. – displayname

2

Ad esempio, se si sta leggendo un file e si verifica un errore di I/O, è improbabile che si ripristini l'errore, quindi rilanciare l'errore all'inizio e di conseguenza terminare l'applicazione non è un problema corso di azione.

D'altra parte, se si anticipano errori recuperabili, è necessario catturare e gestire gli errori. Ad esempio, potresti avere utenti che inseriscono dati in un modulo. Se immettono dati in modo errato, il codice di elaborazione dell'input può generare un'eccezione (ad esempio NumberFormatException durante l'analisi di una stringa numerica non valida). Il tuo codice dovrebbe catturare queste eccezioni e restituire un errore all'utente, chiedendo un input corretto.

Quando si rileva un'eccezione e si lancia RuntimeException, è importante impostare l'eccezione originale come causa per RuntimeException. Ad esempio

gettare nuovo RuntimeException(originalException).