Java - Unterschied Keywords "throw" & "throws"?

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.

MrAmazing2  03.04.2022, 12:37

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?

0
xxxcyberxxx  03.04.2022, 12:52
@MrAmazing2
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ß

1

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!

Lealaluuu 
Fragesteller
 03.04.2022, 12:07

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

?

2
Lealaluuu 
Fragesteller
 03.04.2022, 12:10
@PhotonX

also ist der wesentlich Unterschied einfach nur dass man es einmal vorbeugend und einmal explizit coded, wenn man genau weiß, dass eine Exception eintritt, richtig?

0
PhotonX  03.04.2022, 12:16
@Lealaluuu

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.

1
Lealaluuu 
Fragesteller
 03.04.2022, 12:22
@PhotonX

wenn man throws & throw kombiniert wird dann immer thorws allgemeingültig zuerst überprüft und dann daraufhin der throw, right?

0
Lealaluuu 
Fragesteller
 03.04.2022, 12:34
@PhotonX

Eine Frage hätte ich noch. Wie handhabt man den Auffangprozess professionell?

Sammelt man alle Exceptions in eine extra Methode wo alle try-catch Fälle durchprobiert werden, oder macht man des vor Ort an der betroffenen Stelle?

0
PhotonX  03.04.2022, 12:35
@Lealaluuu

Puh, was good practices angeht, bin ich überfragt, bin eigentlich nicht vom Fach, habe nur mal für dich recherchiert. :)

1