Verständnisfrage zu throws neben Funktionen

Jakob P

Mitglied
Hallo, ich habe folgendes Codebeispiel:
Java:
public static void main(String[] args) {
        int zahl;
        do{
            try{
                zahl = readNumber();
                break;
            }catch (NumberFormatException e){
                System.out.println("Number invalid!");
            }
        }
        while (true);
        System.out.println("Die eingegebene Nummer war: " + zahl);
    }

    public static int readNumber() throws NumberFormatException{
        Scanner scanner= new Scanner(System.in);
        String eingabe = scanner.nextLine();
        int zahl = Integer.valueOf(eingabe);
        return zahl;
    }

Nun meine Frage:
was ist der Vorteil daran, neben die readNumber() "throws NumberFormatException" zu schreiben?
Ich verstehe, dass bei readNumebr() die Exception auftreten kann, da ein String nicht zwingend eine Zahl sein muss, aber ohne dieses throw läuft der Code genau gleich.

Vielen Dank!
 
NumberFormatException ist eine "unchecked Exception" oder RuntimeException. Diese sollen grundsätzlich nicht deklariert werden. Dein Code ist also fehlerhaft. Laufzeitausnahmen stellen Probleme dar, die das Ergebnis eines Programmierproblems sind, und als solche kann vom API-Clientcode vernünftigerweise nicht erwartet werden, dass er sich von ihnen erholt oder sie in irgendeiner Weise behandelt. Es besteht also die Pflicht zur Behandlung und Validierung von Werten jeder Art. Zu solchen Problemen gehören neben deiner NumberFormatException arithmetische Ausnahmen, wie z. B. die Division durch Null, Zeigerausnahmen, wie z. B. der Versuch, über eine Nullreferenz auf ein Objekt zuzugreifen, und Indexierungsausnahmen, wie z. B. der Versuch, über einen zu großen oder zu kleinen Index auf ein Arrayelement zuzugreifen.
Laufzeitausnahmen können überall in einem Programm auftreten, und in einem typischen Programm können sie sehr zahlreich sein. Das Hinzufügen von Laufzeitausnahmen in jeder Methodendeklaration würde die Übersichtlichkeit eines Programms beeinträchtigen. Daher verlangt der Compiler nicht, dass Laufzeitausnahmen abgefangen oder angegeben (obwohl man das kann).
Ein Fall, in dem es gängige Praxis ist, eine RuntimeException zu werfen, ist, wenn der Benutzer eine Methode fehlerhaft aufruft. Zum Beispiel kann eine Methode prüfen, ob eines ihrer Argumente fälschlicherweise null ist. Wenn ein Argument null ist, kann die Methode eine NullPointerException auslösen, was eine ungeprüfte Ausnahme "unchecked Exception" ist.
Im Allgemeinen sollten keine RuntimeExceptions geworfen werden oder eine Unterklasse von RuntimeException erstellt werden, nur weil man sich nicht mit der Spezifikation der Ausnahmen, die eine Methoden auslösen können, herumschlagen will.
Es besteht eine grundlegende Richtlinie: Wenn von einem Client vernünftigerweise erwartet werden kann, dass er sich von einer Ausnahme erholt, machen macht man sie zu einer geprüften Ausnahme. Wenn ein Client nichts tun kann, um sich von der Ausnahme zu erholen, macht man sie zu einer ungeprüften Ausnahme.
 

Neue Themen


Zurück
Oben