try-catch Block um super()



  • Einfache Frage: Gibt es in Java irgendeinen Weg, eine Exception des Super-Konstruktors zu fangen und stattdessen eine andere zu werfen?



  • Na mach eben dort wo der Konstruktor aufgerufen wird ein try/catch rum!?



  • Ich will einen FileInputStream wrappen, der soll statt einer IOException eine SilentIOException werfen.



  • Na wenn Du ihn wrappen willst, hast Du doch keine Probleme, oder?

    Oder willst Du von ihm ableiten? Das wird nicht gehen, da das FileInputStream-Objekt, wenn der Konstruktor wirft, per Definition nicht existiert. Demnach macht es per Definition keinen Sinn, in diesem Fall den Fehler abzufangen und möglicherweise den Konstruktor der abgeleiteten Klasse dennoch zum Erfolg zu bringen.

    Tipp:
    Erstelle eine Klasse, die von InputStream ableitet und einen FileInputStream besitzt. Dann kannst Du im Konstruktor die Exception umwandeln und in der implementierten read-Methode die read-Methode des FIS aufrufen.



  • LordJaxom schrieb:

    Oder willst Du von ihm ableiten?

    Ja, das meinte ich mit wrappen.

    LordJaxom schrieb:

    Das wird nicht gehen, da das FileInputStream-Objekt, wenn der Konstruktor wirft, per Definition nicht existiert. Demnach macht es per Definition keinen Sinn, in diesem Fall den Fehler abzufangen und möglicherweise den Konstruktor der abgeleiteten Klasse dennoch zum Erfolg zu bringen.

    Ich will den Fehler nicht anfangen, ich will leiglich stattdessen eine SilentIOException schmeißen. In etwa so:

    public FileInputStream(String filename)
    {
        try { super(filename); } catch(IOException ex) { throw new SilentIOException(ex); }
    }
    


  • Das weiß der Compiler aber nicht 🙂 Wenn das, was Du machen möchtest möglich wäre, wäre folgender Code gültig:

    try {
        super();
    } catch (Exception e) {
        throw new AnotherException(e);
    }
    

    Folgender jedoch nicht:

    try {
        super();
    } catch (Exception e) {
    }
    

    Ich schätze, das würde zu zu viel Kontextabhängigkeit beim Übersetzen führen. try-catch um den gesamten Konstruktor (wie in C++) gibt's in Java ja leider nicht.

    Für eine mögliche Lösung, die auch nicht wirklich Aufwand bedeutet, siehe Tipp im Edit oben.



  • Dein Tipp erfordert aber viel schreiben von redundantem Code. Ich muss damit nämlich jede Funktion neu implementieren. Der FileInputStream war nur eins von vielen Beispielen, ich muss das für alle Stream-Klassen machen.



  • Ergänzung:
    Vielleicht reicht es nicht, nur read() zu implementieren. Du könntest aber mit IDE-Werkzeugen (Eclipse: Generate Delegate Methods) alle Methoden auf einen Schlag implementieren lassen.



  • LordJaxom schrieb:

    (Eclipse: Generate Delegate Methods) alle Methoden auf einen Schlag implementieren lassen.

    Genau was ich brauche, danke.



  • Du kennst nicht zufällig einen Weg, für jeden Konstruktor eines Members einen entsprechenden Konstruktor zu generieren?



  • 314159265358979 schrieb:

    Dein Tipp erfordert aber viel schreiben von redundantem Code. Ich muss damit nämlich jede Funktion neu implementieren. Der FileInputStream war nur eins von vielen Beispielen, ich muss das für alle Stream-Klassen machen.

    *facepalm* :xmas2:



  • Bist du dir sicher, dass du nicht eigentlich eher Koposition statt Vererbung willst?



  • Ja.


Anmelden zum Antworten