2013-04-01 9 views
5

Per me, questi codiceutilizzando parole chiave getta per dichiarare lancio di eccezioni di runtime

static int faktorial (int n) throws ArithmeticException { 
    if ((n < 0) || (n > 31)) { 
    throw new ArithmeticException(); 
    } 
    if (n > 1) { 
    return n * faktorial(n - 1); 
    } 
    else { 
    return 1; 
    }  
} 

e lo stesso codice senza

throws ArithmeticException 

fare lo stesso, quando lo uso con il seguente codice:

public static void main(String[] args) { 
    try { 
    int n; 
    Scanner sc = new Scanner(System.in); 

    System.out.print("Insert integer number: ");   
    n = sc.nextInt();   
    System.out.println(n + "! = " + faktorial(n)); 
    } 
    catch (InputMismatchException e) { 
    System.out.println("Not an integer number!"); 
    e. printStackTrace(); 
    } 
    catch (RuntimeException e) { 
    System.out.println("Number is too big!"); 
    e. printStackTrace(); 
    } 
} 

qualcuno potrebbe descrivere se l'uso di

throws ArithmeticException 

ha alcuni vantaggi nel mio codice.

Apprezzerò anche qualche buon esempio di utilizzo della parola chiave throws. Grazie mille!

risposta

9

Dal ArithmeticException è un unchecked exception, elencarlo nella specifica throws non ha alcun effetto per quanto riguarda il compilatore.

Tuttavia, penso che sia una buona idea mantenere la specifica throws a scopo di documentazione.

Detto questo, ArithmeticException probabilmente non è l'eccezione giusta per il lancio quando la funzione viene chiamata con un argomento non valido. Utilizzare IllegalArgumentException sarebbe più appropriato.

+0

ha i suoi aspetti positivi, quindi non si può certo dire che sia ridondante – dantuch

+0

Grazie mille! – mcihak

+1

@Keppil Fa ** non ** costringervi a prenderlo. – dantuch

3

la firma del metodo precedente utilizza l'espressione throws ArithmeticException per dire l'utente di questa funzione che metodo potrebbe lanciare questa eccezione e dovrebbero essere consapevoli e prenderlo (se vogliono - "vogliono" solo perché questa eccezione non è selezionata - e pianificare una soluzione alternativa in quel caso).

Tranne che ArithmeticException non è l'eccezione appropriata da utilizzare in questo caso (è possibile utilizzare tecnicamente uno qualsiasi di questi). Un'eccezione migliore per il lancio sarebbe IllegalArgumentException poiché implica che l'argomento passato non è corretto.

+0

Grazie per il vostro consiglio! – mcihak

0

Poiché Java non fornisce un semplice flag True/False per determinare se una determinata eccezione è checked or unchecked, è necessario essere a conoscenza dei tipi di eccezioni che (come programmatore) devono gestire (prendere o re-throw) e che puoi scegliere di non gestire (ignorare in modo efficace).

In particolare, l'intera classe RunTimeException è deselezionata e ArithmeticException è la sua sottoclasse.

3

Oltre a ciò che è detto, c'è un lato positivo che trovo utile nel codice.

Eclipse può utilizzare tali informazioni (che il metodo è dichiarato con throws RuntimeException) e (su richiesta) aggiungere corretta clausola di cattura.

Vediamo questo:

public static void main(String[] args) { 
    test(); 
} 

private static void test() { 
    foo(); 
    bar(); 
    baz(); 
} 

public static void foo() { 

} 

public static void bar() throws NullPointerException { 

} 

public static void baz() throws IllegalArgumentException { 

} 

aggiungendo try/ catch block metodo test all'interno si tradurrà in:

private static void test() { 
    try { 
     foo(); 
     bar(); 
     baz(); 
    } catch (NullPointerException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IllegalArgumentException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

Che bello, non è vero? Tuttavia, funziona solo con il metodo 1 ° livello di invocazione, quindi non inquina più elevati livelli di astrazione con più catture di eccezioni di runtime:

public static void main(String[] args) { 
    try { 
     test(); 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

private static void test() { 
    foo(); 
    bar(); 
    baz(); 
} 

Che bello pure.

In ogni caso, visto che tiri in javadoc è probabilmente molto più importante :)

void Test.baz() throws IllegalArgumentException 
Problemi correlati