Erste Schritte Exceptions nicht verstanden

chaoshoney

Mitglied
Hallihallo 🙂 Ich versuche mir gerade Exceptions beizubringen, leider aber eher mit mäßigem Erfolg. Ich bin auf Code gestoßen, den ich hier mal ganz abgespackt aufschreibe:

Code:
private String getXmlFromThere(String string) throws IOException{
    String urlString = ...;

    try{
          ...
   }
   catch(MalformedURLException unrecoverable){
        
         throw new AssertError(unrecoverable);
   }
}

Und ich sehe hier leider ganz und gar nicht durch. 🙁
1) Eine IOException ist ja eine sogenannte checked exception und wird deswegen standardmäßig mit throws deklariert. Soweit okay, aber was passiert mit der IOException, wenn diese tatsächliche auftritt? Wird sie einfach allein durch das throws abgefangen oder wird sie weitergereicht an andere Klassen oder was passiert genau? 🙁

2) Okay, im try-catch-Block wollen wir verhindern, dass eine MalformedURLException unser Programm zerschießt. Wenn nun aber eine auftritt, dann werfen wir plötzlich eine neue Exception? Und die erzeugen wir?! Aber warum erzeuge ich eine neue Exception, wenn ich gerade eine abgefangen habe und was hat denn plötzlich ein AssertError mit einer MalformedURLException zu tun, woher weiß ich, dass ich die werfen will UND warum übergeben wir die MalformedURLException als Paramerter an AssertError? 😵 UND wo wird denn dann mein AssertError abgefangen???

Tut mir leid, dass diese Fragewucht hier so geballt kommt, aber ich bin ziemlich verwirrt und leicht verzweifelt, was den Code betrifft. 🙁

Ich würde mich sehr über Erklärungen freuen!
 
1. Die IOException wird weitergereicht an den Caller.
2. Dein Code wirft eventuell eine MalformedURLException, die aufgefangen wird und durch einen (wesentlich schwerwiegenderen Error ersetzt wird).

Lezteres ist sicherlich nicht so wie es gemacht werden sollte.
Eine checked exception wirft man ja, damit der Caller etwas unternehmen kann um den Fehler zu korrigieren. Ein Error wird normalerweise nur von der JVM geworfen, in Faellen wo ein Recovery nicht moeglich ist.
Wenn man eine Exception mit einer anderen ersetzt, nennt man das Exception chaining:
Code:
try {
  obj.doSomething(args);
} catch (LowLevelException cause) {
  // translate
  throw new HigherLevelException(cause);
}

Der Sinn ist, dem jeweils aufrufenden Teil (dem Caller) einen vernuenftigen Hinweis zu geben, was zu tun ist um den Fehler zu vermeiden. Ein Beispiel:

Code:
try {
  String[] fileContent = readFile(String fileName);  
} catch (FileNotFoundException cause) {
  // translate
  throw new IllegalArgumentException("Die Datei kann nicht gelesen werden, weil die Datei nicht existiert", cause);
}

Obige Exception sagt dem Caller, dass die Datei nicht existiert und es ist eine IllegalArgumentException, weil der fileName z.B. eine Nutzereingabe ist.

Cheers,
Andy
 
2. Dein Code wirft eventuell eine MalformedURLException, die aufgefangen wird und durch einen (wesentlich schwerwiegenderen Error ersetzt wird).

Lezteres ist sicherlich nicht so wie es gemacht werden sollte.
Eine checked exception wirft man ja, damit der Caller etwas unternehmen kann um den Fehler zu korrigieren. Ein Error wird normalerweise nur von der JVM geworfen, in Faellen wo ein Recovery nicht moeglich ist.

Der Sinn ist, dem jeweils aufrufenden Teil (dem Caller) einen vernuenftigen Hinweis zu geben, was zu tun ist um den Fehler zu vermeiden. Ein Beispiel:

AssertError gibt es so gar nicht, vllt ist das nur dumme Benennung for RTE 😉

Und ohne zu wissen, wodurch die Eingabe der Methode zustande kommt, kann ein AssertionError durchaus passend sein. Kann ja durchaus zum Laden von einer in der jar liegenden Config-Datei genutzt werden, das ist dann offensichlich 'n schwerwiegender Programmierfehler...
 

Zurück
Oben