eigene Exception Klasse

traps12

Mitglied
hallo leute!

ich hätte da ne frage zu exception. wenn ich eine eigene Exception Klasse schreibe (also von der Basisklasse Exception ableite), diese aber in der main abfangen will, dann brauche ich doch keine throw klausel werfen oder?

gruß

traps12
 

remy

Aktives Mitglied
Hi,

damit eine Exception überhaupt Sinn macht, muss sie schon an einer Stelle "geworfen" werden.

Main-Methoden sollten nie ein "throws Exc" enthalten, sondern tatsächlich spätestens dort mit try/catch abgefangen werden.
 

traps12

Mitglied
danke für die antwort. aber ist das nicht ein widerspruch, wie kann ich an einer stelle eine throw ex werfen , wenn die main keine throw erhalten darf?
 

Volvagia

Top Contributor
Ne. An irgend eine Stelle musst du ja abfangen. Wenn die Main throwt, wird das von der VM abgefangen. Sonst wird die Exception immer weiter geleitet, bis irgendwann der Rechner neu startet. (Wird glaub ich Triple Fault genannt.)
Die Main sollte aber nicht throwen, nur Untermethoden. Meiner Meinung nach macht throwen in den wenigsten Fällen wirklich Sinn, da du auf die Exception ja auch reagieren solltest. Wenn du nur eine "Irgend eine Ausnahme ist irgendwo im Programm aufgetreten"-Nachricht in der Main ausgibst, kennt sich weder der Anwender noch du, wenn er dir das mitteilt aus.
 

traps12

Mitglied
achso, gut danke.

wenn throwen deiner meinung nach nicht wirklich sinn macht, was sollte man ansonsten machen?
wenn ich z.b duch 0 teilen würde oder anstelle einer zahl ein buchstaben übergebe, kann ich diese vorgänge ja verhindern, aber was meinst du sonst?
 

Volvagia

Top Contributor
Mit einen try/catch(/finally) umgeben und darauf reagieren.
Wenn du z. B. eine IOException eines Writers/OutputStream weiterleitet, der ausgibt, dass die Datei derzeit von einen anderen Programm gelockt ist, und du diese über die Main throwst, wird die Nachricht in der Shell landen. Aber 99 % der Programme werden ohne sie gestartet (javaw), wodurch der Anwender den Fehler garnicht zu Gesicht bekommt.
Wenn du sie weiter zur Main leitest, kannst du dort nur eine allgemeine Nachricht ausgeben, die alle Ausnamen betrifft, oder du kannst durchgehen, um welche es sich handelt, woran du vermutlich sehr lange sitzten würdest.
Wenn du sie direkt handlest, kannst du soetwas wie "Schreibevorgang fehlgeschlagen.\n\nProgramm meldet\ne.getMessage()" ausgeben lassen, womit man schon sehr viel mehr anfangen, und was vermutlich auch der Anwender verstehen würde.

Ich denke, throwen bringt nur etwas, wenn man Klassen schreibt, die man öfters in Programmen für bestimmte Aufgaben verwendet (so wie die aus der JRE), und nicht, wenn man wie meistens einfache Abläufe schreibt, in denen die anderen Klassen dann verwendet werden.
 

traps12

Mitglied
hmm, stimmt.

eine letzte frage noch. du sagtest ja finally block. ánweisungen in diesem block werden aufjedenfall augeführt -exception oder keine exception-

was wäre am sinnvollsten, in so einem finally block zu implementieren?

danke

gruß
traps12
 

remy

Aktives Mitglied
Oder mit einem Beispiel ausgedrückt, das für ein throws spricht: du hast eine Methode, die bei einer Exception nicht weiter ausgeführt werden soll und diese die Exc an die aufrufende Stelle weitergibt, so dass z.B. eine andere Methode aufgerufen werden soll.
Kannst du aber in der Methode in allen Fällen so reagieren, dass die Methode funktionell und logisch weiter ausgeführt werden kann, ist ein try/catch eher angebracht.

hmm, stimmt.

eine letzte frage noch. du sagtest ja finally block. ánweisungen in diesem block werden aufjedenfall augeführt -exception oder keine exception-

was wäre am sinnvollsten, in so einem finally block zu implementieren?

danke

gruß
traps12

Bekannte Fälle dafür sind Streams und Connections.
Z.B. sollte bei ein FileStream immer versucht werden, diesen wieder zu schließen, um z.B. die Datei wieder freizugeben. Bei Connections, z.B. zu einer Datenbank, sollte auch hier versucht werden, diese zu schließen, um die Ressourcen der Datenbank wieder freizugeben; springt das Programm aus dem try/catch-Block raus, ohne die Connection zu schließen (z.B. bei einem falschen SQL-Statement), bleibt sie offen und die DB wartet bis zum Timeout auf weitere Anweisungen.
Etwas irritierend ist dabei, dass in den Fällen vom Aufruf "close()" von Streams und Connections ein weiterer try/catch-Block im finally-Block des übergeordneten try/catch-Blocks nötig ist. Auch beim Schließen können Exc geworfen werden, die abgefangen werden wollen.
 
Zuletzt bearbeitet:

Volvagia

Top Contributor
Stimmt auch wieder. Ich bin eher davon ausgegangen, dass der Benutzer möglichst gut informiert wird.
Ein close eines Streams/Reader/Writer gehört auf jeden Fall in ein finally. Ansonst noch das Unlock einer Lock-Klasse. Mehr das unbedingt hinein gehören fällt mir jetzt auch nicht ein. Ein finally-Block hat aber nur bedingt etwas mit Exceptions zu tun, ein try ist gültig, solange catch und finally in einer OR-Beziehung existieren (ich weiß, blöd ausgedrückt, aber das beide optional sind ist eigendlich auch falsch), ohne eins von beiden wird das try aber natürlich sinnlos und auch ungültig. finally wird, solange das Programm nicht terminiert wird, IMMER ausgeführt.
Vor kurzen hat jemand geschrieben, dass man darin sogar den returnwert der Methode "überschreiben" kann. Wäre aber dann sehr künstlerischer Code.
 

traps12

Mitglied
erstmals vielen dank für euren beitrag!

mir ist heute eine weitere frage eingefallen, die ich leider nirgendswo finden konnte.

unzwar:

wenn ich eine abgeleitete Klasse habe und die die methoden die ich in der basisklasse mit exceptions bearbeitet habe , muss ich dann automatisch die abgeleite klasse (falls ich die methoden überschreibe) mit exception handlen?

und falls ich in einer methode eine methode aufrufe(die aufgerufene methode eine exception hat) was muss ich dann machen?

wie sieht es mit interface aus??

danke im voraus
 

remy

Aktives Mitglied
eine interessante Frage :)

es verhält sich folgendermaßen: eine Unterklasse (abgeleitet) darf überschriebene Methoden enthalten, die weniger oder keine Exceptions schmeißt, andersrum geht das nicht: soll eine Unterklasse eine überschriebene Methode enthalten, die in der Oberklasse z.B. keinen modifier "throws" enthält, darf sie ebenfalls keine Exceptions "throwen". Ein Verstoß gegen diese Regel wird der Compiler nicht akzeptieren.
Das ganze gilt genauso für Interfaces.

Das ganze kann man sich logisch anhand von Polymorphie erklären. Nehmen wir als Beispiel die abstrakte Oberklasse Auto und die davon abgeleitete Klasse Audi. Nun haben wir noch ein Array vom Typ Auto, in dem sich Instanzen von Audis befinden.
Positivbeispiel: Autos haben die Methode "... abstract fahren() throws Exception", es kann also was schiefgehen. Möchten wir nun diese Methode auf die Autos im Array ausführen, müssen wir die mögliche Ausnahme behandeln, auch wenn die implementierte Methode in Audi keine Exception mehr schmeißt "... fahren()". In diesem Fall gehen wir also davon aus, dass die Methode fahren() bei Autos zu Problemen führen KANN, aber eine spezialisierte Klasse diese Methode so implementiert, dass gar kein Fehler mehr entsteht. Des weiteren könnte man sich vorstellen, dass eine spezialisierte Klasse "VW" die Methode "fahren() throws Exception" hat, was kein Problem darstellt, wenn wir allgemein Instanzen von "Auto" behandeln, denn wir fangen mögliche Ausnahmen ab. (Hoffe, es ist bis hierhin nicht zu verwirrend).

Negativbeispiel:
Die abstrakte Klasse "Auto" hat die Methode "abstract fahren()", die keine Exception schmeißt, also kein "throws". Wenn die spezielle Klasse "Audi" wieder die Methode "fahren()" ohne "throws" implementiert, haben wir kein Problem. Haben wir aber wieder die spezielle Klasse "VW", die die Methode "fahren() throws Exception" implementiert, sehen wir die potentielle Exception bei der allgemeinen Klasse "Auto" nicht mehr. Führen wir also "fahren()" auf eine VW-Instanz aus, die in einer Auto-Variable (oder auch Array) steckt, sehen wir hier nicht, dass "fahren()" auch eine Exception schmeißen kann. Kommt es dann zur Ausnahme, sind wir nicht vorbereitet und es knallt.

Die Behandlung von Exceptions können wir uns nur dann ersparen, wenn wir wissen, dass die Auto-Instanz tatsächlich ein Audi ist, der bei "fahren()" keine Exceptions schmeißt, d.h. die Instanz des Audis ist einer Variable vom Typ Audi zugewiesen (klappt natürlich nur beim Positivbeispiel).

Wie gesagt, ich hoffe, das ist irgendwie rübergekommen. Ansonsten kann ich auch noch zwei Code-Beispiele basteln.
 

traps12

Mitglied
hey vielen dank! ich habe es auch mit einem programm mal ausprobiert funktioniert! das mit der methode ist mir auch klar geworden: falls man in einer methode einen throw wirft und es in einer anderen methode verwendet muss es auch eine throw im methodenkopf besitzen.

viele grüße
traps12
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
L Meine erste eigene Exception Klasse Java Basics - Anfänger-Themen 10
S Eigene Exception Klasse - fehlender Konstruktor mit String Java Basics - Anfänger-Themen 3
T Eigene Exception - ohne werfen abfangen Java Basics - Anfänger-Themen 2
low_in_the_head Eigene Exception nutzen Java Basics - Anfänger-Themen 4
L Eigene Exception schreiben bei zu langem Array Java Basics - Anfänger-Themen 10
F Klassen Eigene Exception Bedingungen festlegen Java Basics - Anfänger-Themen 2
C eigene Exception Java Basics - Anfänger-Themen 4
K Klassen Eigene Exception verwenden Java Basics - Anfänger-Themen 9
S Eigene Exception Schreiben und Welche Auslösen wie ? Java Basics - Anfänger-Themen 7
B eigene Exception.... Java Basics - Anfänger-Themen 5
F Eigene Exception StackTrace und Message ist leer warum??? Java Basics - Anfänger-Themen 3
R Eigene Exception deklarieren Java Basics - Anfänger-Themen 3
F eigene Exception aus try-catch werfen Java Basics - Anfänger-Themen 10
Amina556 Eigene Klasse definieren Java Basics - Anfänger-Themen 9
T Datentypen Eigene Datentypen Java Basics - Anfänger-Themen 15
C Archiv für eigene Klassen Java Basics - Anfänger-Themen 9
D Attribut Telefonnummer - eigene Klasse oder String Java Basics - Anfänger-Themen 13
B JUnit 4: Wie man die eigene Liste testen kann [TDD] Java Basics - Anfänger-Themen 46
C eigene Methoden erstellen (Instanzmethoden) Java Basics - Anfänger-Themen 7
S Eigene LinkedList Klasse Java Basics - Anfänger-Themen 4
I Eigene Java Tools Nutzung Java Basics - Anfänger-Themen 6
G eigene Bibliothek einbinden Java Basics - Anfänger-Themen 1
K Eigene Annotations, Pre-/Post-/Call-Method Java Basics - Anfänger-Themen 6
O Erste Schritte Eigene charAt(i) Methode schreiben Java Basics - Anfänger-Themen 10
D Methoden Eigene Methode um alle Ausgaben aufzurufen Java Basics - Anfänger-Themen 17
P Maven und eigene Jars Java Basics - Anfänger-Themen 4
J Algorithmus - Strings auf eigene Reihenfolge miteinander vergleichen Java Basics - Anfänger-Themen 4
R Interface Eigene Objekte in Listen sortieren mit Interface Comparable Java Basics - Anfänger-Themen 5
A Eigene Methoden entwicken Java Basics - Anfänger-Themen 3
H GSON-Bibliothek für eigene Programme benutzen Java Basics - Anfänger-Themen 2
H Klassen auf eigene Klasse zugreifen Java Basics - Anfänger-Themen 2
N Eclipse - eigene Icons unter ClassPath Resource Java Basics - Anfänger-Themen 0
N Eigene Stream Methoden implementieren Java Basics - Anfänger-Themen 3
R eigene Graphikbedienelemente Java Basics - Anfänger-Themen 8
V Generics / eigene Liste Java Basics - Anfänger-Themen 4
T Eigene Bedingung in IF-Bedingung Java Basics - Anfänger-Themen 22
P Java 8 & Eigene Applets Java Basics - Anfänger-Themen 3
E Best Practice Exaktes Rechnen mit (Pseudo-)Rationalen/Realen Zahlen. Operations Zuweisung für (eigene) Klassen Java Basics - Anfänger-Themen 3
G eigene Bibliothek in Java importieren Java Basics - Anfänger-Themen 5
D Klassen Eigene Klasse für ArrayList Java Basics - Anfänger-Themen 6
M Wann eigene implementierte HashCode Methode zwingend erforderlich? Java Basics - Anfänger-Themen 1
B Klassen Eigene "non static" Klasse in Main verwenden! Java Basics - Anfänger-Themen 12
P Vererbung Eigene HashMap Variante Java Basics - Anfänger-Themen 2
J Eigene Klasse für die Variablen? Java Basics - Anfänger-Themen 3
P Eigene Knöpfe mit eigenem Listener Java Basics - Anfänger-Themen 5
S Wann existiert eine Instanz (eigene Klasse) Java Basics - Anfänger-Themen 8
T Muss ein Parametertest immer eine eigene Testklasse sein? Java Basics - Anfänger-Themen 3
B Multithreading und eigene Queue entwickeln Java Basics - Anfänger-Themen 3
O GUI: Eigene Fenster "Form"? Java Basics - Anfänger-Themen 13
F Eigene LinkedList - toString Java Basics - Anfänger-Themen 10
O Denkanstöße für eigene Konfigurations-Datei Java Basics - Anfänger-Themen 12
SexyPenny90 Wieso ist diese eigene Equals-Methode schlecht? Java Basics - Anfänger-Themen 17
M externe JARs in die eigene JAR einbinden Java Basics - Anfänger-Themen 9
V Klassen import - einfaches Umleiten auf eigene Klassen? Java Basics - Anfänger-Themen 8
B eigene klasse in listen eintragen Java Basics - Anfänger-Themen 6
A Objekte in eigene Klasse auslagern Java Basics - Anfänger-Themen 2
S [JavaFX 2.1] - Eigene Sprachauswahl? Java Basics - Anfänger-Themen 4
J eigene packages bzw klassen verwenden Java Basics - Anfänger-Themen 25
E Eigene Stackklasse Java Basics - Anfänger-Themen 7
B Eigene Exceptions entwerfen Java Basics - Anfänger-Themen 3
P eigene kleine Datenverwaltung Java Basics - Anfänger-Themen 5
N Eigene Methoden-> Werte übergeben Java Basics - Anfänger-Themen 5
U Klassen Eigene Klassen importieren Java Basics - Anfänger-Themen 13
Kenan89 ActionListener in eigene Klasse Java Basics - Anfänger-Themen 8
E Object in eigene Klasse umwandeln? Java Basics - Anfänger-Themen 7
S Eigene Klassen addieren Java Basics - Anfänger-Themen 3
B OOP Eigene Objekte in Arrays zusammenfassen Java Basics - Anfänger-Themen 3
E Eigene class datum Java Basics - Anfänger-Themen 2
G Eigene MessageBox kreieren Java Basics - Anfänger-Themen 9
I Erste Schritte Eigene Fehlermeldungen bei Exceptions Java Basics - Anfänger-Themen 19
F Klassen Eigene Klasse definieren Java Basics - Anfänger-Themen 4
S Eigene KeyEvent-Mask erstellen Java Basics - Anfänger-Themen 4
X Eigene Libary Java Basics - Anfänger-Themen 2
Crashbreaker Eigene Java-Programm ohne hilfe des CMD starten Java Basics - Anfänger-Themen 11
A Klassen Eigene Datenklasse - Strings mit fixer Länge Java Basics - Anfänger-Themen 2
G Shape um eigene Achse drehen Java Basics - Anfänger-Themen 2
P Vererbung Basisklasse soll eigene Methode benutzen Java Basics - Anfänger-Themen 38
F Eigene Klasse für die Keys von HashMap Java Basics - Anfänger-Themen 5
J Eigene kleine Datenbank programmieren Java Basics - Anfänger-Themen 2
G Eigene Klasse als Array, zugriff? Java Basics - Anfänger-Themen 2
xehpuk Ordner "Eigene Bilder" ansteuern Java Basics - Anfänger-Themen 3
V Sonderzeichen als eigene "Operatoren" im JTextField Java Basics - Anfänger-Themen 4
S Eigene Stack Klasse Java Basics - Anfänger-Themen 26
D Eigene equals methode schreiben Java Basics - Anfänger-Themen 4
dataframe OOP Eigene typisierte Liste Java Basics - Anfänger-Themen 3
W GUI als eigene Klasse oder in die Startklasse? Java Basics - Anfänger-Themen 21
T Konstruktor für eigene Klasse erstellen Java Basics - Anfänger-Themen 6
H Buttonbefehle in eigene Klasse schreiben Java Basics - Anfänger-Themen 8
M Datentypen Eigene iterierbare Liste Java Basics - Anfänger-Themen 4
G Eigene Klasse für externe Befehle - Warten auf Prozesse Java Basics - Anfänger-Themen 6
S Klassendiagramm - nur eigene Klassen? Java Basics - Anfänger-Themen 3
nrg Eigene simple List-Klasse programmieren Java Basics - Anfänger-Themen 3
C Eigene Interpreter-Programmiersprache mit Java Java Basics - Anfänger-Themen 17
N Java Programm soll Datei in eigene jar schreiben Java Basics - Anfänger-Themen 13
M Eigene Pakete in Eclipse erstellen Java Basics - Anfänger-Themen 5
M Eigene Hash Funktion Java Basics - Anfänger-Themen 5
O Eigene Exceptions Java Basics - Anfänger-Themen 11
H eigene Schriftarten registrieren Java Basics - Anfänger-Themen 5
Kasoki Eigene Funktionen / Commands Java Basics - Anfänger-Themen 14
M Eigene LinkedList und Nodes Java Basics - Anfänger-Themen 20

Ähnliche Java Themen

Neue Themen


Oben