Java Klassen - Konstruktor abbrechen und mit code fortfahren?
Hallo ihr, bevor ich ins Detail gehe: Gibt es eine Möglichkeit einen Konstruktor einer Klasse, während er läuft, abzubrechen und mit dem restlichen Code fortzufahren?
Folgendes ist zu lösen: Ich lese Schlüssel aus meiner Registry aus und fasse Zusammenhänge in einem eigenen Objekt zusammen. Der Konstruktor in meinem Objekt ist so aufgebaut, das er mit wenig Infos startet und die restlichen Zusammenhänge (Unterschlüssel / Pfade / ...) selbstständig sucht und ergänzt.
PROBLEM: Jetzt kommt es allerdings vor, das dabei die Schlüssel vom Typ REG_EXPAND_SZ nicht richtig gelesen werden können und ich diese einfach ignorieren möchte. Allerdings findet diese Überprüfung statt, während das Objekt erstellt wird. Jetzt suche ich nach einer Möglichkeit, das wenn die Überprüfung fehl schlägt, den Vorgang abzubrechen und mit dem restlichen Code weitergemacht wird, statt eine RuntimeException zu werfen und mein Programm in tausend roten Fehlermeldungen im Keim zu ersticken :)
JA, ich könnte diese ganze Prozedur machen bevor ich den Konstruktor aufrufe, möchte ich aber nicht und ist nur der äußerste Notfall ;)
4 Antworten
Nur weil du eine Ausnahme wirfst, erhältst du doch keine roten Fehlermeldungen. Die Ausnahmen kannst du doch sehr komfortabel abfangen!
Du kannst einfach eine eigene Ausnahmenklasse von RuntimeException oder Throwable ableiten, und dann zum Beispiel eine "RegExpandSzException" werfen, die du dort abfängst, wo deine Objekte erzeugt werden.
Natürlich wäre ein Redesign hier angebrachter, aber du hast ja selbst gesagt, dass du es nur so und nicht anders machen willst.
Also: Eigene ExceptionKlasse beuen, werfen, abfangen, und glücklich sein. Sehr einfach! Und völlig ohne rote Fehlermeldungen! :)
Du kannst mit "return" den Konstruktor "beenden".
Alternativ kannst du auch einfach mit nem IF überprüfen ob der Schlüssel existiert und falls nicht dann halt den Teil nicht ausführen..
Entweder beendest du den Konstruktor wie schon geschrieben mit return oder du verwendest ein try/catch Konstrukt.
Ich habe mir die Frage gerade selbst beantwortet (wie fast immer wenn man nach stundenlangem Kopfzerbrechen im Internet fragt ^^)
Ich habe den Aufruf vom Konstruktor in eine try/catch Anweisung gelegt und zack ... gelöst!
try{ TolleKlasse obj = new TolleKlasse("Tolle Argumente"); } catch(RuntimeException e){}
So ziemlich genau das, was ich vor weniger als einer Minute in meiner Antwort geschrieben habe. :)
Aber schön, dass du jetzt eine brauchbare Lösung hast! :)
Es funktioniert zwar, das ist aber kein schöner Code-Stil...