Java - Unterschied Keywords "throw" & "throws"?
Hallo,
ich finde die Definitionen die ich bislang im Internet gefunden habe etwas verwirrend.
Kann mir jemand den Unterschied zwischen den beiden Keywords (throw & throws) erklären?
2 Antworten
Throw wird in einer Methode, gefolgt von der Exception selbst, genutzt, um eben eine Exception selbst zu werfen. Diese muss dann an anderer Stelle abgefangen werden, damit der Programmablauf nicht unterbrochen wird.
Beispiel:
public int validateNumber(int n) {
if (n < 42) {
throw new InvalidNumberException();
}
return n;
}
Throws im Methodenkopf signalisiert dem Aufrufer, dass in der Methode eine Exception auftreten kann, diese jedoch in der Methode selbst nicht abgefangen wird. Das muss dann entweder beim Aufrufer passieren oder dieser muss die Exception auch weitergeben. Hierbei kannst du auch mehrere Exceptions angeben
Die Exception kann dabei entweder von den genutzten Statements kommen oder direkt mit throw erzeugt werden.
Beispiel:
public void withdrawMoney(double amount) throws InsufficientMoneyException, WithdrawalLimitReachedException {
// Methodenkörper
}
Allgemein muss Throws angegeben werden, wenn die Exception "geprüft" ist, also bei der Kompilierung vorhanden war. Hierfür muss die Exception dann eine Subklasse von "Exception" sein. Ist sie eine Subklasse von "RuntimeException", muss throws nicht angegeben werden.
Müsste dann validateNumber nicht „throws InvalidNumberException“ oben stehen haben?
Habe gerade noch die Antwort ergänzt, weil ich da etwas vergessen habe.
Sofern die Exception eine Subklasse von RuntimeException ist (was bei dem Beispiel durchaus Sinn macht, wenn man mit z.B. Nutzereingaben arbeitet) und der Fehler somit nicht bei der Kompilierung bestand, muss throws nicht angegeben werden. Es kann jedoch angegeben werden, damit der Aufrufer darüber bescheid weiß
Hier ist es recht schön und mit Beispielen erklärt: https://beginnersbook.com/2013/04/difference-between-throw-and-throws-in-java/
Wenn noch Fragen sind, einfach fragen!
Verstehe ich das richtig...
throw wird im Methodenkörper verwendet, um eine explizite Ausnahme auszulösen
throws wird in der Methodensignatur verwendet, um die Ausnahmen zu deklarieren, um auf die vorhandenen Anweisungen auftreten könnte
?
Genau. throw nimmt man her, wenn der problematische Zustand bereits eingetreten ist, throws kündigt an, dass eine Exception eintreten könnte und benennt diese. Sie kann dann mit dem angekündigten Namen via catch aufgefangen werden und so darauf reagiert werden.
Also man kann bei der Deklaration einer Methode via throws eine mögliche Exception deklarieren, dann innerhalb der Methode via throw die Exception werfen, welche dann außerhalb der Methode via try & catch gefangen wird. Hier ein Code-Beispiel (gegen Ende des Artikels):
https://www.geeksforgeeks.org/try-catch-throw-and-throws-in-java/
Puh, was good practices angeht, bin ich überfragt, bin eigentlich nicht vom Fach, habe nur mal für dich recherchiert. :)
Müsste dann validateNumber nicht „throws InvalidNumberException“ oben stehen haben?
Oder nimmt man das nur für die „weitergabe“ von exceptions her, nicht aber wenn die direkt in der methode erst erzeugt wird?