Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Unterschied zwischen Checked und Unchecked Exceptions
Kann mir einer sagen, was der Unterschied zwischen den Checked- und Unchecked Exception ist?
Was mich verwirrt ist, dass die Definition sagt, dass die checked Exceptions gefangen werden MÜSSEN. Die Unchecked MÜSSEN also nicht gefangen werden, oder was?
Wenn ich die aber nicht abfange, dann wird doch mein Programm abstürzen, also muss ich die doch auch abfangen...
Würde mich freuen, wenn mir das einer kurz erklären könnte.
Die Methode Integer.parseInt(String s) kann beispielsweise eine NumberFormatException werfen.
Wenn ich mir aber sicher bin, dass mein Text garantiert nur aus Ziffern besteht, kann ich mir das Fangen der Exception sparen:
Java:
String text = "123";
int zahl = Integer.parseInt(text);
Es ist aber keine schlechte Idee, die Exception dennoch zu fangen.
Etwas generalisiert kann man auch sagen:
Tritt eine unchekced exception auf, dann hast du zuvor in deinem Code etwas nicht beachtet, und diese deutet eher auf einen Programmierfehler hin, wohingegen checked exceptions auf ein Fehlverhalten hindeuten, welches du nicht beeinflussen kannst, wie z.B. eine abgebrochene Verbindung, während du auf eine Datenbank auf einer anderen Maschine zugreifst.
Daher ist es oft gar nicht mal schlecht, wenn dein Programm bei einer unchecked Exception deftig auf die Nase fällt.
Ok, ich denke ich habe den Unterschied jetzt etwas mehr begriffen, danke.
Und wie sieht es mit dem Auftreten der Exceptions aus? Ich meine mal gehört zu haben, dass beide, also checked und unchecked, IMMER NUR WÄHREND DER LAUFZEIT auftreten. Stimmt das?
Natürlich können Exceptions nur zur Laufzeit auftreten da wird der Code ja auch ausgeführt
Wenn der Compiler einen Fehler wirft ist das eine Exception vom Compiler(programm) zu dessen Laufzeit.
Hmm, ok... Wenn sie nur zur Laufzeit auftreten, warum meldet mir Eclipse schon beim schreiben des Programms dass eine Excetion auftritt z.B bei diesem Code hier:
Java:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class EigenesProgr {
public static void main(String[] args) {
File path = new File("test.txt");
path.createNewFile();
FileInputStream datei = new FileInputStream("test.txt");
while(datei.available()>0){
System.out.print((char) datei.read());
}
datei.close();
Schon bevor ich den Code ausführe bekomme ich ja eine Fehlermeldung, dass das Programm nicht Compilierbar ist, weil beispielsweise in Zeile 9 eine IOExcetion auftritt, die ich behandeln muss. Würde das nicht heissen, dass die checked Exceptions auch schon vorher auftreten können?
Eine checked Exception musst du behandeln, wo du sie behandelst bleibt aber dir überlassen.
Der Compiler sagt dir nur das er den Code nicht kompilieren kann weil er erwartet dass die Exception entweder mittels try/catch behandelt wird oder aber die Methode "gesagt" bekommt sie kann die Exception einfach weiterschmeißen.
Eine letzte Frage habe ich noch
Und zwar sollte ich bei der folgendem Code dafür sorgen, dass der Code einfach nur compilierbar wird, ohne an der Klasse was zu verändern:
Java:
public class Kaffeeautomat {
private float kaffeepulverGramm;
public void machKaffee() {
if (kaffeepulverGramm < 12)
throw new KaffeevorratLeerException();
kaffeepulverGramm -= 12;
}
public static void main(String[] args){
Kaffeeautomat automat = new Kaffeeautomat();
automat.machKaffee();
}
}
Mir war klar, dass ich eine Exception schreiben muss. Das habe ich dann auch gemacht. Die sah dann so aus:
Java:
public class KaffeevorratLeerException extends Exception {
public KaffeevorratLeerException(){
super("Nicht genug Kaffeepulver");
}
}
Jedoch konnte ich das immernoch nicht kompilieren. Warum nicht? Die in der Methode machKaffee(); vorkommende Exception existiert ja nun.
Liegt es vllt daran, dass die Exception zwar geworfen wird aber nicht in der main aufgefangen werden kann, weil dort der try-catch block fehlt?
Ja, aber sie muß entweder mit try/catch abgefangen werden oder man muß mit throws deklarieren, daß sie geworfen werden kann. Für beides müsstest du Kaffeeautomat ändern, was du ja nicht darfst. Das liegt daran, dass die Klasse Exception checked Exceptions definiert. Sie ist also nicht als Basisklasse für deine KaffeevorratLeerException geeignet.
Das liegt daran, dass die Klasse Exception checked Exceptions definiert. Sie ist also nicht als Basisklasse für deine KaffeevorratLeerException geeignet.
Könntest du das vllt etwas ausführlicher erläutern?
-Also werden die unchecked Exceptions nicht von der Klasse Exceptions abgedeckt, verstehe ich das richtig?
-Woher weiss ich denn, wenn ich eine eigene Exception schreibe, von welcher Art von Exception meine Exception erben muss?
EDIT: Erben nicht alle Exceptons von der Oberklasse Exception? So habe ich es zumindest mal gelernt.
Ja, das stimmt. Trotzdem sind nicht alle Nachfahren von Exception checked. Das liegt übrigens nicht daran, wie die Exception-Klassen programmiert wurden, sondern daran, wie Java mit ihnen umgeht. Also angenommen du würdest eine eigene Klasse ErrorXY programmieren, die exakt denselben Code enthält, wie beispielsweise die Klasse Error (die ist unchecked), dann wäre ErrorXY trotzdem checked.