Unterschied zwischen RuntimeException und Exception (Java)?

2 Antworten

RuntimeException leitet von Exception ab.
Technisch gibt es keinen Unterschied, die Frage ist eher: Wann wird was geworfen?
Unterschiedliche Exception-Typen dienen also nur der Unterscheidung und dem Transport von relevanten Informationen.
Genauso leiten viele Exception-Typen von RuntimeException ab und andere leiten direkt von Exception und nicht von RuntimeException.

Das "throws" am Methodenkopf sagt nur aus, dass eine Methode eine Exception der jeweiligen Typs oder eine Ableitung davon wirft und zwingt dich beim Aufruf der Methode, diesen Exception-Typ zu behandeln.
Wenn Du nun "thows MyCustomException" schreibst, musst Du bei jedem Aufruf diese MyCustomException behandeln oder der Methode selbst einen passenden thows-Ausdruck geben und damit die Behandlung nach "oben" weiter reichen.

Exceptions sind im Grunde Fehlermechanismen

In Programmiersprachen die nicht Java sind, hast du in der Regel nur eine Art von Fehler (RuntimeExceptions)

die kernaussage ist diesbezüglich, dass du nicht gezwungen bist try catch blöcke zu benutzen.

was meine ich mit zwang?

java hat checked exceptions dessen grundgedanke es ist, dass der programmierer schon bevor das programm gestartet wird, über potenzielle fehler informiert wird

in der praxis passiert das immer wenn der programmierer eine methode benutzt dessen methodensignatur ein "throws"-statement besitzt
(bsp.: Files.readString; man sieht in der methoden signatur throws ioexception)

das throws statement "sagt" dem programmierer beim methodenaufruf etwas kann schief gehen und lässt den programmierer nicht mehr das programm starten bis der programmierer den (potenziellen) fehler im code berücksichtigt

wie geht man mit einer checked exception um?

öfters will man einen fehler einfach das programm zum absturz bringen lassen, damit sich keine potenziellen bugs verstecken in einem potenziell fehlerhaften programm (fail-fast).
deshalb werden checked exceptions auch öfters in eine runtime exception gepackt
(bsp.: IOException e -> throw new UncheckedIOException(e))

falls der schnelle absturz nicht das ziel ist

entweder:
fehleranfälliger code wird in einem try block gepackt.
bei einem fehler springt das programm in den catch block und dort wird code ausgeführt um dementsprechend darauf zu reagieren.
sonst wird im try block der code regulär ausgeführt.

oder:
man packt ein throws an die signatur der methode die man gerade schreibt.
in anderen worten: man überlässt den ganzen stress dem nächsten kek, der sich mit der methode, die gerade geschrieben wird, beschäftigt.
der fehler wird einfach zum nächsten methodenaufruf delegiert

Woher ich das weiß:Studium / Ausbildung