Aus dem Kurs: Java Grundkurs 2: Objektorientierte Programmierung, Fehlerbehandlung, Stream-API
Runtime vs. Checked Exceptions – Tutorial zu Java
Aus dem Kurs: Java Grundkurs 2: Objektorientierte Programmierung, Fehlerbehandlung, Stream-API
Runtime vs. Checked Exceptions
Wir haben im vorherigen Video ja schon mit der ArithmeticException zu tun gehabt, und dies ist eine Exception. Und dies ist eine sogenannte RuntimeException. Also ein Fehler, der zur Laufzeit Programms unerwartet auftreten kann. RuntimeExceptions sind meistens Zeichen für Bugs. Und in unserem vorherigen Video haben wir zum Beispiel explizit einen Bug eingebaut, indem wir durch 0 dividiert haben. Und wäre die Null durch eine Benutzereingabe in unser Programm gekommen, so bedeutet dies letztlich auch, dass wir die Nutzereingaben nicht ausreichend validiert haben. Es gibt in Java aber noch eine weitere Kategorie von Exceptions, die sogenannten CheckedExceptions. Dies sind Fehler, die unser Programm erwarten muss und für die wir eine explizite Fehlerbehandlung durchführen müssen. Diese können zum Beispiel bei Dateisysteminteraktion auftreten, und deshalb wollen wir uns das einmal in der Praxis anschauen. Ich habe hier eine Testdatei abgelegt, text_file.txt, die liegt im Root unseres Projekts, und hier sind 2 Textzeilen drin. Hallo world from a file! Machen wir mal aus Hello world, "Hello world from a file!" "We can have multiple lines here", OK. Wir möchten mal diese Datei jetzt einlesen und ausgeben. Zu diesem Zweck können wir die Java-Klasse Files benutzen. java.io.file ist das Package der Klassname Files. Und hier haben wir eine Methode readAllLines. So, die verwenden wir. Und die gibt uns eine Liste von Strings zurück, nämlich die entsprechenden Zeilen, und kriegt hier als Argument ein Path. Und den Path können wir konstruieren, indem wir hier sagen Path.of, und geben nun hier einfach den Pfad an. Hier wissen, wir möchten im Root die Datei lesen. Deswegen müssen wir hier relativ keinen weiteren Pfad angeben, und nun den Dateinamen test_file.txt. OK, das speichern wir uns in einer Variable, lines, und das wird dann eine Variable vom Typ Liste von String. OK, wir sehen hier schon, das Ganze ist rot unterschlängelt, was passiert hier? Der Compiler gibt uns hier schon einen Fehler an: Unhandled exception.java.IOException. Ja, das ist nämlich jetzt der Fall, dass hier eine CheckedException auftreten kann. Das heißt, wir müssen explizit eine Fehlerbehandlung in unser Programm einfügen, damit wir dadurch anzeigen, uns ist klar, beim Lesen von Dateien können Fehler auftreten, deswegen muss unser Programm damit umgehen können. Was für Fehler könnten auftreten? Es kann sein, dass diese Datei nicht existiert, dass diese Datei verschoben wird, wie wir da drauf zugreifen. Also das ist schon immer der Fall, unser Programm mit der Außenwelt interagiert, in diesem Fall mit dem Dateisystem, mit dem Betriebssystem, mit anderem Programm. Dann müssen wir in der Regel Fehler erwarten und damit umgehen können. Und das ist an dieser Stelle eine Hilfestellung der Sprache Java hier für uns des Compilers, wie er sagt. Ja, das ist eine CheckedException, bitte sorge dafür, dass du auch entsprechend auf diese Exception, auf diese Ausnahme entsprechend reagierst. Am einfachsten fügen wir die Fehlerbehandlung jetzt hier ein, indem wir Alt+Enter drücken. Und dann kriegen wir von IntelliJ hier schon den Vorschlag Surround with try/catch, und das machen wir an dieser Stelle. Alternativ hätten wir auch sagen können Add exception to method signature. Und das ist, wenn wir dann eine Methode implementieren, wo wir damit ausdrücken, diese Methode kann CheckedExceptions werfen. Das heißt, jeder Aufrufender müsste sich dann um diese Exception kümmern. Das heißt, wir delegieren die Fehlerbehandlung weiter nach oben. In diesem Fall fügen wir aber den Try/Catch Block ein. Und macht IntelliJ schon hier sehr schön für uns. Wir sehen hier also OK, Catch IOException. Ja, wir wissen, eine IOException kann hier auftreten. Und dieser Text im Catch-Block, den ignorieren wir an dieser Stelle mal, dass wir in einem späteren Video sehen wir selber, Exceptions weiter werfen können. Stattdessen möchten wir hier an dieser Stelle einfach nur ein Error ausgeben auf der Konsole. Das System.err,println "Error reading file". OK, und wenn das nicht passiert, dann möchten wir einfach hergehen und über die Linien hier iterieren und die einfach alle ausgeben. So, genau. Wir führen das Ganze jetzt mal aus, und was würden wir jetzt als Ausgabe erwarten? Genau, wir erwarten in diesem Fall tatsächlich einfach die Ausgabe der Datei, denn wir haben jetzt auch nicht zu erwarten, dass ein Fehler auftreten würde. Diese Datei existiert, wir können auf die zugreifen, wir können sie lesen, dann können wir hier entsprechend den Text ausgeben. Jetzt fügen wir hier mal einen Fehler ein. Wir nehmen nämlich hier eine Datei, die nicht existiert. Wenn ich das Ganze jetzt wieder ausführe, was wäre zu erwarten? Richtig, in diesem Fall wird eine IOException geworfen. Wir springen dann in diesen Catch-Block rein und führen den Code, der hier in diesem Catch-Block steht, aus. Und das bedeutet, dass wir diesen Code überspringen. Da wir hier in Zeile 14 einen Fehler haben, wir springen also von 14 in Zeile 18 und rufen dann diesen Block hier auf, führen diesen Block aus mit dieser Exception. Und wir können uns auch nochmal anschauen, was denn jetzt in diesem Fall in dieser Exception drin stehen würde. Machen wir einfach mal e.getMessage. Wir sehen jetzt hier die Ausgabe von der Message, ist einfach nur der Teilnahme. Das ist natürlich nicht super hilfreich. Das sagt uns jetzt gar nicht, was für einen Fehler hier eingetreten ist. Wir können aber im Prinzip einfach die toString Methode des ExceptionObjekts aufrufen bzw. wir können die toString Methode auch weglassen, denn wenn wir ein Objekt mit einem String konkatenieren, wird diese Methode automatisch aufgerufen. Das machen wir jetzt an dieser Stelle einfach mal, und in diesem Fall sehen wir schon viel mehr nettere Details. Wir sehen nämlich die spezielle Klasse der IOException. Nämlich es ist eine No such file exception. No such file exception extended, die IOException. Das heißt, wir sehen hier eine Vererbungshierarchie in Effekt. Und in dem Fall können wir schon ganz gut verstehen, was passiert ist. Wir haben einen Fehler, da diese Datei gar nicht existiert. Korrigieren wir das Ganze wieder, führen das Ganze nochmal aus und jetzt sehen wir wieder die korrekte Ausgabe.
Inhalt
-
-
-
-
-
(Gesperrt)
Fehler mit try-catch-Block behandeln5 Min. 56 Sek.
-
Runtime vs. Checked Exceptions6 Min. 24 Sek.
-
(Gesperrt)
Fehler werfen5 Min. 8 Sek.
-
(Gesperrt)
Eigene Fehlerklassen erstellen und werfen4 Min. 33 Sek.
-
(Gesperrt)
Challenge: FileLineAppender55 Sek.
-
(Gesperrt)
Solution: FileLineAppender5 Min. 11 Sek.
-
(Gesperrt)
-
-