catch mit finally

Status
Nicht offen für weitere Antworten.

Urs

Mitglied
Hallo, ich habe eine Methode mit einem String als return-Wert, der am Anfang der Methode mit "ERROR" initialisiert wird. Die Methode hat einen catch-Block. Nun wenn eine Exception auftritt, wie sieht der return-Wert aus? Muss ich einen finally-Block machen in dem return String steht, damit ich einen gültigen return-Wert habe? Im Fehlerfall soll immer ERROR zurückgegeben werden.
Beispiel:
Code:
private String test() {
        String strRcv = "ERROR";
        try {
           ....
        }
        catch ( Exception e ) {
          ...
        }
        return strRcv;
    }
Code:
private String test() {
        String strRcv = "ERROR";
        try {
           ....
        }
        catch ( Exception e ) {
          ...
        }
        finally{
            return strRcv;
        }
    }

danke und Gruss Urs
 
Ein Beispiel dazu:

Code:
   try {
      String s = null;
      s.indexOf("blupp"); // wirft NullPointerException
    }
    catch (IllegalArgumentException e) {
      System.err.println("Fehler !");
    }
    finally {
      System.out.println("finally"); // wird ausgegeben
    }
    System.out.println("Hinter try-catch-finally"); // wird nicht mehr ausgegeben

Anmerkung: Würde man anstatt der IllegalArgumentException die (richtige) Exception (=NullPointerException) catchen, so würde die letzte Anweisung System.out.println("Hinter try-catch-finally"); ausgeführt werden.

Ganz allgemeine Erklärung dazu: Die finally-Klausel wird immer dann ausgeführt (natürlich am Ende), wenn die zugehörige try-Klausel betreten wurde.
 
Urs hat gesagt.:
Hallo, ich habe eine Methode mit einem String als return-Wert, der am Anfang der Methode mit "ERROR" initialisiert wird. Die Methode hat einen catch-Block. Nun wenn eine Exception auftritt, wie sieht der return-Wert aus? Muss ich einen finally-Block machen in dem return String steht, damit ich einen gültigen return-Wert habe? Im Fehlerfall soll immer ERROR zurückgegeben werden.
Beispiel:
Code:
private String test() {
        String strRcv = "ERROR";
        try {
           ....
        }
        catch ( Exception e ) {
          ...
        }
        return strRcv;
    }
Code:
private String test() {
        String strRcv = "ERROR";
        try {
           ....
        }
        catch ( Exception e ) {
          ...
        }
        finally{
            return strRcv;
        }
    }

danke und Gruss Urs

Ich würde es so machen:
Code:
String strRcv = "ERROR";
try {
   // Arbeiten
} catch (Exception e) { // Hier wenn möglich vielleicht die Exception die fallen kann abfagen (wenn es sich eingrenzen lässt)
// wenn Fehler aufgetreten zur Sicherheit String nochmal mit Error füllen (is nur notwendig, wenn der String vorher evtl. verändert wurde)
strRcv = "ERROR";
}
return strRcv;
Keine Ahnung was du im TRY machen willst, aber ein finally ist hier sicher nicht unbedingt notwendig.
 
d.h. also, wenn die entsprechende Exception gefangen wird, wird die return Anweisung immer ausgeführt. In welchem Fall braucht man einen finally-Block?
Gruss Urs
 
siehe Beispiel von sky,
für den Fall dass eine Exception nach außen geworfen wird (nicht abgefangen) hat man noch die Möglichkeit Code auszuführen,

das braucht man in deinem Beispiel nicht unbedingt, stimmt 😉

-------

wenn eine Exception nach außen geworfen wird gibts übrigens keinen Rückgabewert,
return irgendwas ist also in jedem Fall unnötig/ falsch?!

edit: ach ne klappt doch mit return, dann wird ja keine Exception mehr zurückgegeben..

siehe auch
http://www.galileocomputing.de/openbook/javainsel3/javainsel_070001.htm#Xxx998459
 
Urs hat gesagt.:
d.h. also, wenn die entsprechende Exception gefangen wird, wird die return Anweisung immer ausgeführt.
Sie wird nur darum ausgeführt, weil sie direkt nach deinem try-catch-Block kommt.

finally brauchst du, wenn du Anweisungen hast, die in jedem Fall noch ausgeführt werden sollen

Klassisches Beispiel: Du willst eine Datei kopieren und öffnest beide Dateien im try-Block.
Auch die Kopieraktion selbst findet in diesem Block statt um IO-Exceptions aufzufangen.
Dann wird der finally Block benutzt um eventuell geöffnete Dateien sauber zu schließen.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben