# sauberer Stil von return Wert (try, catch, finally)



## Sempah (7. Apr 2009)

Hallo zusammen,

ich habe eine Methode methodeX:


```
public String methodeX(String nameX) {
  String nameY = null;

  try {
    nameY = nameX;
  } catch (Exception e)
  // ...
  } finally {
  return nameY 
  }
}
```

Eclipse meckert mit dem Warning: "finally block does not complete normally"
Jetzt könnte ich entweder eine Annotation (SuppressWarnings...) einfügen oder das "return nameY" nach dem finally schreiben.

Aber wie ist hier der saubere Stil?


----------



## Der Müde Joe (7. Apr 2009)

Im finally-block nie ein return. Der finally-block wird immer ausgeführt und darum werden alle
Exceptions oder vorherigen returns verschluckt.


----------



## Beni (7. Apr 2009)

Im finally Block gehört kein return.

Gehen wir mal davon aus, dass im try-catch ein Error geworfen wird. Diesen Error fängst du nicht. Es geht in den finally-Block und dort steht ein return... ja was denn nun? Wird der Error weitergeworfen oder verschluckt (es gibt natürlich eine Antwort, aber darum geht es mir nicht)? Die Situation ist total unklar: deshalb gehört das return nicht in den finally Block.


----------



## faetzminator (7. Apr 2009)

```
public String methodeX(String nameX) {
  String nameY = null;

  try {
    nameY = nameX;
  } catch (Exception e)
  // ...
  }
  return nameY; 
}
```


----------



## Sempah (7. Apr 2009)

Okay das das return-Statement nicht in den finally-Block gehört habe ich mir schon gedacht bzw. gelesen, aber was ich deklariere ja schon vorher die Variable (welche ich übergebe) und initialisiere sie mit null.
Im Try-Block weise ich lediglich einen neuen Wert zu. 

Also auch wenn eine Exception übergeben wird, könnte doch dann im finally ein Wert (eben mit null) übergeben werden?


----------



## musiKk (7. Apr 2009)

Ja, aber das return macht man trotzdem nicht im finally-, sondern im catch-Block (oder ganz danach, je nach dem).


----------



## Orri (22. Apr 2009)

Hallo 

mich würde interessieren was es bedeutet mit dem finally genau auf sich hat. Hab schon verstanden das es ausgeführt wird. Aber warum wird eine variable welche im try und catch block zu finden ist nicht im finally block z.B ausgegeben. 

Fehler: ... might not have been initialized...  *es geht hier um feld_ref*.


```
try
		{
			feld_ref=new int[groeße];
			for(int i=0; i<feld_ref.length; i++)
				feld_ref[i]=1+i; 
		}
		catch(NegativeArraySizeException e1_ref)
		{
			feld_ref=new int[10];
			System.out.println(e1_ref.getClass().getName());
		}
		finally
		{
			for(int i=0; i<feld_ref.length; i++)
			{
				System.out.println("Wert "+ feld_ref[i]);
```

wenn mir da einer bitte helfen könnten wäre ich sehr dankbar.


----------



## AmunRa (22. Apr 2009)

Der Compiler kann nicht wissen, dass die Initalisierung funktioniert und für ihn ist damit nicht sichergestellt, dass im finally block 
die Variable initialisiert ist. 

Es könnte  ja theoretisch seine, dass eine andere Exception geworfen wird und dann ist die var wirklich nicht initialisiert


----------



## Orri (22. Apr 2009)

aha verstehe dankeschön


----------



## musiKk (22. Apr 2009)

Das ist ja eigentlich ganz normal das Prinzip vom Scope. Eine in einem Block lokal definierte Variable ist außerhalb des Blockes nicht sichtbar.


----------

