2013-04-01 3 views
5

zu erklären, dieser Codemit Keyword wirft Werfen von Runtime Ausnahmen für mich

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; 
    }  
} 

und der gleiche Code ohne

throws ArithmeticException 

das gleiche tun, wenn ich es mit dem folgenden Code verwenden:

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(); 
    } 
} 

Könnte mir jemand beschreiben, wenn die Verwendung von

throws ArithmeticException 

hat einige Vorteile in meinem Code.

Ich werde auch ein gutes Beispiel für die Verwendung des Schlüsselwortes throws zu schätzen wissen. Vielen Dank!

Antwort

9

Da ArithmeticException ein unchecked exception ist, hat die Auflistung in der throws Spezifikation keinen Effekt, soweit der Compiler betroffen ist.

Trotzdem halte ich es für eine gute Idee, die throws Spezifikation für Dokumentationszwecke zu halten.

Das heißt, ArithmeticException ist wahrscheinlich nicht die richtige Ausnahme zu werfen, wenn die Funktion mit einem ungültigen Argument aufgerufen wird. Die Verwendung von IllegalArgumentException wäre angemessener.

+0

es seine upsides hat, so dass Sie nicht nur überflüssig, es ist – dantuch

+0

Vielen Dank sagen kann! – mcihak

+1

@Keppil Es macht ** nicht ** Sie zwingen, es zu fangen. – dantuch

3

Die obige Methode Signatur verwendet das die Expression throws ArithmeticException die Benutzer dieser Funktion zu sagen, dass Methode, um diese Ausnahme auslösen könnte, und sie sollten es bewusst und fängt sein (wenn sie wollen - „will“ nur weil diese Ausnahme nicht aktiviert ist - und in diesem Fall einen Workaround planen.

Außer dass ArithmeticException ist nicht die richtige Ausnahme in diesem Fall (Sie könnten technisch eine von ihnen verwenden). Eine bessere Ausnahme zum Werfen wäre IllegalArgumentException, da es impliziert, dass das übergebene Argument falsch war.

+0

Vielen Dank für Ihren Rat! – mcihak

0

Da Java kein einfaches Wahr/Falsch-Flag zur Verfügung stellt, um festzustellen, ob eine Ausnahme checked or unchecked ist, müssen Sie wissen, welche Arten von Ausnahmen Sie (als Programmierer) behandeln müssen (Entweder fangen oder erneut werfen)) und die Sie wählen können, nicht zu behandeln (effektiv zu ignorieren). Die gesamte RunTimeException Klasse ist deaktiviert, und ArithmeticException ist ihre Unterklasse.

3

Abgesehen von dem, was gesagt wird, gibt es eine Oberseite, die ich finde, die mir hilft, zu kodieren.

Eclipse kann diese Information verwenden (dass die Methode mit throws RuntimeException deklariert wird) und (auf Anfrage) richtige catch-Klausel hinzufügen.

Lets Blick auf diese:

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 { 

} 

Zugabe try/ catch block innerhalb Methode test bewirkt:

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(); 
    } 
} 

das ist schön, es ist nicht wahr? Allerdings funktioniert es nur mit dem 1. Ebene Methodenaufruf, so dass es nicht verschmutzt nicht ein höhere Abstraktionsebene mit mehreren Fängen Laufzeit Ausnahmen:

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(); 
} 

das auch schön ist.

Wie auch immer, zu sehen, dass in javadoc wirft, ist wahrscheinlich viel wichtiger :)

void Test.baz() throws IllegalArgumentException 
Verwandte Themen