Welche Klasse bildet in Java den Kern der objektorientierten Ausnahmebehandlung?
Die Klasse Exception.
Exception
Wozu können die Unterklassen von Exception herangezogen werden?
Zur Behandlung vieler unterschiedlicher Ausnahmesituationen.
Was löst ArithmeticException typischerweise aus, Beispiel?
ArithmeticException
Division durch Null. Beispiel: int n = 0; return 1/n;
int n = 0; return 1/n;
Was löst ArrayIndexOutOfBoundsException aus, Beispiel?
ArrayIndexOutOfBoundsException
Zugriff auf ein Listenelement außerhalb des definierten Bereichs. Beispiel: int[] zahlen = new int[8]; zahlen[10] = 4;
int[] zahlen = new int[8]; zahlen[10] = 4;
Was löst NullPointerException aus, Beispiel?
NullPointerException
Zugriff auf ein nicht instanziiertes Objekt. Beispiel: Kunde k = null; k.setName("Meier");
Kunde k = null; k.setName("Meier");
Nenne die 3 grundsätzlichen Alternativen, wie Java mit einer Exception umgehen kann.
1) Die Exception wird innerhalb der Methode abgefangen. 2) Die Exception wird an das aufrufende Programm weitergeleitet. 3) Die Exception wird abgefangen und mit einer spezifischen Meldung an das aufrufende Programm weitergeleitet.
Was ist ein try/catch-Block?
Das Sprachkonstrukt, mit dem Exceptions abgefangen werden; im try-Block stehen die kritischen Programmanweisungen, im catch-Block werden die Ausnahmen behandelt.Das Sprachkonstrukt, mit dem Exceptions abgefangen werden; im try-Block stehen die kritischen Programmanweisungen, im catch-Block werden die Ausnahmen behandelt.
Was umschließt der try-Block?
Den fehleranfälligen Programmabschnitt.
Was legt der catch-Block fest?
Welche im try-Block auftretenden Ausnahmen abgefangen werden sollen und wie sie behandelt werden sollen.
Was ist der Nachteil, wenn eine Exception nur innerhalb der Methode abgefangen wird (z. B. durch Rückgabe von 0), ohne das aufrufende Programm zu informieren?
Man profitiert noch nicht von allen Vorteilen der expliziten Ausnahmebehandlung, da das aufrufende Programm keine Möglichkeit erhält, selbst auf den Fehler zu reagieren.
Was ist das Schlüsselwort throws?
throws
Es zeigt in der Methodensignatur an, welche Exceptions von der Methode geworfen (weitergeleitet) werden können.
Wozu muss die Signatur einer Methode erweitert werden, damit sie Exceptions weiterleiten kann?
Um das Schlüsselwort throws, gefolgt von der Auflistung aller Exceptions, die in der Methode auftreten können.
Woran können aufrufende Programme erkennen, welche Ausnahmen von einer Methode zu erwarten sind?
Anhand der Methodensignatur (dem throws-Zusatz).
Wohin verlagert sich bei dieser Alternative die Ausnahmebehandlung per try/catch-Block?
In das aufrufende Programm.
Mit welcher Methode eines Exception-Objekts kann im catch-Block die Fehlermeldung ermittelt werden?
getMessage()
Was passiert mit dem Programm nach der Behandlung einer abgefangenen, weitergeleiteten Exception im catch-Block?
Es kann mit den folgenden Anweisungen normal fortfahren.
Müssen alle in Java integrierten Standard-Exceptions zwingend behandelt (mit try/catch abgefangen) werden?
Nein, nicht alle
Wie werden Exceptions genannt, die nicht zwingend behandelt werden müssen (der Compiler meldet ohne try/catch keinen Fehler)?
"Unchecked" Exceptions.
Woran erkennt man unchecked Exceptions?
Sie sind alle Unterklassen von RuntimeException (das trifft z. B. auf alle Exceptions aus Tabelle 18 zu: ArithmeticException, ArrayIndexOutOfBoundsException, NullPointerException).
RuntimeException
Wie werden alle anderen Exceptions genannt, und was gilt für sie?
"Checked" Exceptions – sie müssen abgefangen werden. Dazu zählen auch selbst definierte Exceptions.
Was ist der Nachteil einer unveränderten Standard-Fehlermeldung (z. B. "Division durch Null"), wenn eigentlich der Warenkorb leer ist?
Sie nennt nur die technische Wirkung, nicht die eigentliche fachliche Ursache – für den Nutzer ist die Meldung dadurch unverständlich.
Was ist das Schlüsselwort throw?
throw
Es ermöglicht das Erzeugen (Werfen) einer Exception.
Wie wird bei der dritten Alternative konkret vorgegangen?
Die ursprüngliche Exception wird per try/catch-Block gefangen, um daraufhin mit throw eine neue Exception (z. B. erneut eine ArithmeticException) mit einer spezifischen, angepassten Fehlermeldung zu werfen.
Wie wird die angepasste Fehlermeldung an die neue Exception übergeben?
Als Parameter an den Konstruktor der Exception.
Was ändert sich bei der dritten Variante für das aufrufende Programm im Vergleich zur zweiten Variante?
Nichts – es muss weiterhin dieselbe deklarierte Exception abfangen; lediglich der Inhalt der Fehlermeldung hat sich verändert.
Können zu einem try-Block mehrere catch-Blöcke definiert werden?
Ja
Nenne die 2 typischen Gründe für mehrere catch-Blöcke.
a) Im try-Block können viele unterschiedliche Exceptions auftreten, die jeweils separat behandelt werden sollen. b) Neben einer bestimmten Standard-Exception sollen zusätzlich auch alle anderen Exceptions abgefangen werden.
Was passiert, wenn eine Ausnahme auftritt und mehrere catch-Blöcke definiert sind?
Es wird der Reihe nach überprüft, welcher catch-Block zur geworfenen Ausnahme passt; passt keiner der speziellen catch-Blöcke, wird sie im allgemeinen catch-Block (für Exception) abgefangen.
Warum funktioniert ein allgemeiner catch-Block (für Exception) als "Auffangnetz" für alle nicht spezifisch behandelten Ausnahmen?
Weil alle Ausnahmen in Java Unterklassen von Exception sind.
Was ist der finally-Block?
Ein Block, in dem Anweisungen festgehalten werden, die unabhängig davon ausgeführt werden, ob im try/catch-Block eine Ausnahme aufgetreten ist und behandelt wurde oder nicht.
Wo wird der finally-Block definiert, und wann wird er ausgeführt?
Nach den catch-Blöcken; er wird in jedem Fall ausgeführt, egal ob und welche Exception aufgetreten ist.
Wofür wird der finally-Block typischerweise genutzt?
Für zwingend notwendige Aufräumarbeiten.
Welches Problem löst der finally-Block, das ohne ihn zu doppeltem Code führen würde?
Ohne finally-Block gibt es zusätzlich zum normalen Ablauf drei weitere Möglichkeiten, wie der try-Block verlassen werden kann; für jeden dieser Fälle müsste man separat sicherstellen, dass die Aufräumarbeiten durchgeführt werden – der finally-Block bündelt das an einer einzigen Stelle.
Warum ist die zweite Alternative (Weiterleiten der Exception mit throws) grundsätzlich besser als das reine interne Abfangen (Alternative 1)?
Beim internen Abfangen trifft die Methode selbst eine Entscheidung (z. B. Rückgabe von 0), die für den konkreten Anwendungsfall unpassend oder zu unspezifisch sein kann. Bei der Weiterleitung erhält das aufrufende Programm – das oft mehr Kontext über die eigentliche Situation hat (z. B. der Online-Shop weiß, dass es um einen Kunden-Statistikaufruf geht) – die Verantwortung und Möglichkeit, angemessen auf den Fehler zu reagieren, statt sich mit einer pauschalen internen Lösung zufriedenzugeben.
Warum ist es sinnvoll, dass unchecked Exceptions nicht zwingend abgefangen werden müssen, checked Exceptions aber schon?
Unchecked Exceptions (Unterklassen von RuntimeException) entstehen meist durch Programmierfehler (z. B. Division durch Null, Nullzugriff), die potenziell an sehr vielen Stellen im Code auftreten könnten – eine Zwangsbehandlung überall wäre unpraktikabel. Checked Exceptions signalisieren dagegen erwartbare, fachlich relevante Ausnahmesituationen (z. B. eine ungültige Eingabe), für die der Entwickler bewusst eine Behandlungsstrategie vorsehen soll – der Compiler erzwingt das, um sicherzustellen, dass solche Fälle nicht versehentlich übersehen werden.
Warum verändert sich beim Übergang von Alternative 2 zu Alternative 3 (angepasste Fehlermeldung) nichts am aufrufenden Programm?
Weil sich nur der Inhalt der Fehlermeldung ändert, nicht der Typ der Exception oder die Methodensignatur (throws ArithmeticException bleibt gleich). Das aufrufende Programm fängt weiterhin denselben Exception-Typ mit demselben try/catch-Aufbau ab – lediglich der Text, den getMessage() liefert, ist jetzt aussagekräftiger.
throws ArithmeticException
Warum sollte man bei mehreren catch-Blöcken die spezifischeren Exception-Typen vor dem allgemeinen catch-Block für Exception auflisten?
Da die Prüfung der Reihe nach erfolgt und alle Exceptions letztlich Unterklassen von Exception sind, würde ein an erster Stelle stehender allgemeiner catch-Block (für Exception) bereits jede Ausnahme abfangen – die spezifischeren catch-Blöcke danach würden nie erreicht. Die spezifischeren Blöcke müssen daher vor dem allgemeinen stehen, damit jede Exception zuerst mit dem passendsten, spezifischsten Block behandelt wird.
Erkläre am Beispiel der Methode preisProArtikel() des Warenkorbs den vollständigen Weg von Alternative 1 bis Alternative 3.
preisProArtikel()
Ist der Warenkorb leer, kommt es beim Berechnen des Durchschnittspreises zur Division durch Null (ArithmeticException). Alternative 1: Die Methode fängt die Exception selbst per try/catch ab und gibt einfach 0 zurück – der Online-Shop erfährt nichts vom Problem. Alternative 2: Die Methode wird stattdessen mit throws ArithmeticException deklariert und leitet die Exception an den Online-Shop weiter; dieser fängt sie in einem eigenen try/catch-Block ab und gibt über getMessage() eine Meldung aus. Alternative 3: Damit die Meldung nicht nur "Division durch Null", sondern verständlich "Warenkorb ist leer" lautet, fängt preisProArtikel() die ursprüngliche Exception intern ab und wirft mit throw eine neue ArithmeticException mit dieser spezifischen Nachricht als Konstruktor-Parameter – der Online-Shop fängt weiterhin denselben Exception-Typ ab, erhält aber jetzt eine aussagekräftige Meldung.
Erklären Sie die drei Alternativen des Umgangs mit Exceptions in Java sowie den Unterschied zwischen checked und unchecked Exceptions.
Java bietet mit der Klasse Exception ein objektorientiertes Konzept zur Ausnahmebehandlung, ergänzt um vordefinierte Standard-Exceptions wie ArithmeticException, ArrayIndexOutOfBoundsException und NullPointerException. Beim Umgang mit einer Exception gibt es drei Alternativen: (1) Sie wird innerhalb der Methode mit einem try/catch-Block abgefangen und behandelt, ohne dass das aufrufende Programm informiert wird. (2) Sie wird mittels throws in der Methodensignatur an das aufrufende Programm weitergeleitet, das sie dann selbst per try/catch fängt und z. B. über getMessage() die Fehlermeldung ausliest. (3) Sie wird zunächst intern abgefangen und mit throw als neue Exception mit einer spezifischen, kontextbezogenen Fehlermeldung erneut geworfen. Zu einem try-Block können mehrere catch-Blöcke definiert werden, die der Reihe nach auf Passung geprüft werden; ein allgemeiner catch-Block für Exception fängt dabei alle nicht spezifisch behandelten Ausnahmen ab. Ein finally-Block wird unabhängig vom Auftreten einer Exception immer ausgeführt und eignet sich für zwingend notwendige Aufräumarbeiten. Nicht alle Exceptions müssen zwingend abgefangen werden: "Unchecked" Exceptions (Unterklassen von RuntimeException, z. B. alle Standard-Exceptions aus Tabelle 18) können, müssen aber nicht behandelt werden; alle anderen, sogenannte "checked" Exceptions – einschließlich selbst definierter Exceptions – müssen zwingend abgefangen werden.
Last changed16 days ago