# Return String



## ehlr (22. Dez 2011)

Hallo,
Möchte einen String Variable returnen.
Leider wird return ausgabe unterkringelt.


```
public class game {

	
	public static String wahl(int a) {
		 
		
		if (a == 1) {
			 String ausgabe  = "Stein";
		}
		
		if (a == 2) {
			String ausgabe = "Schere";
		}
		
		if (a == 3) {
			String ausgabe = "Papier";
		}
			

		return ausgabe;
	}
	
	
}
```


----------



## Kiri (22. Dez 2011)

ehlr hat gesagt.:


> ```
> public class game {
> 
> 
> ...



So müsste es lauten, ansonsten ist ausgabe jeweils nur IN den If-Zweigen bekannt!

[EDIT]Außerdem hast du drei Variablen mit gleichem Namen "ausgabe" deklariert.[/EDIT]


----------



## ehlr (22. Dez 2011)

Musst es noch als Null deklarieren, sonst kam der Fehler wieder!
Danke!!!


Also hier fehlerfrei :


```
public class game {
 
    
    public static String wahl(int a) {
         
        String ausgabe = null;
        if (a == 1) {
             ausgabe  = "Stein";
        }
        
        if (a == 2) {
            ausgabe = "Schere";
        }
        
        if (a == 3) {
            ausgabe = "Papier";
        }
            
 
        return ausgabe;
    }
    
}
```


----------



## xehpuk (23. Dez 2011)

Kiri hat gesagt.:


> Außerdem hast du drei Variablen mit gleichem Namen "ausgabe" deklariert.


… was kein Problem darstellen sollte, da sie nur in den jeweiligen if-Blöcken sichtbar sind.
Wie bereits erwähnt, war dein Code auch nicht lauffähig.

Diese Vorgehensweise ist auch nicht optimal, da immer alle drei if-Abfragen durchlaufen werden. Daher entweder if-else oder schöner switch:

```
public static String wahl(final int a) {
	switch (a) {
		case 1:
			return "Stein";
		case 2:
			return "Schere";
		case 3:
			return "Papier";
		default:
			return null;
	}
}
```
Literale solltest du übrigens als Konstanten definieren. Außerdem könntest du dir überlegen, eine IllegalArgumentException zu schmeißen, statt null zurückzugeben.


----------



## VfL_Freak (23. Dez 2011)

Moin,



ehlr hat gesagt.:


> Musst es noch als Null deklarieren, sonst kam der Fehler wieder!
> 
> ```
> String ausgabe = null;
> ```



Nein, besser als leeren String initialisieren !!

```
String ausgabe = "";
```
Bei größeren Projekten gibt es sonst garantiert irgendwann, irgendwo eine Stelle, wo sowas mit 'ner NPE knallt .... 

Gruß
Klaus


----------



## tfa (23. Dez 2011)

Wenn der leere String doch aber falsch ist, sollte lieber eine Exception fliegen, als dass man mit falschen Werten weiter rechnet. Gerade in großen Projekten. Die Idee mit der IllegalArgumentException  ist natürlich noch besser.


----------



## ehlr (23. Dez 2011)

Da die zu übergebene Variable immer gleich ist und von einem Button ausgelöst wird, ist meiner Meinung nach keine Exception notwenig. Es wird also eine Zufallszahl übergeben.


----------



## VfL_Freak (23. Dez 2011)

Moin,


ehlr hat gesagt.:


> Da die zu übergebene Variable immer gleich ist und von einem Button ausgelöst wird, ist meiner Meinung nach keine Exception notwenig. Es wird also eine Zufallszahl übergeben.


Na ja, wenn Du meinst .... ueh:

Das mag auch im Moment vielleicht stimmen - aber eine solche Annahme (wie sagen die Kölner so schön: "es het noch immer jod jejange" ....) ist aber ganz sicher eine potentielle Gefahrenquelle.
Spätestens wenn Du irgendwann einen weiteren Button einbaust, der dann vielleicht der erwarteten Wert NICHT liefert (ob gewollt oder fehlerhafterweise), bekommst hier ein Problem !

Ergo ist die Idee mit der Exception ist also wirklich gut und macht die Stelle in Deiner Software sicherer !

Gruß
Klaus


----------



## bygones (23. Dez 2011)

sobald man mit switch arbeitet sollte der default fall eine Exception werfen (ausnahmen gibt es).


```
public static String wahl(final int a) {
    switch (a) {
        case 1:
            return "Stein";
        case 2:
            return "Schere";
        case 3:
            return "Papier";
        default:
            throw new IllegalArgumentException("cant handle " + a);
    }
}
```
vor allem bei Enums ist das essentiell. Wenn sich enums erweitern, man aber vergisst alle zugehoerigen switches zu aendern laeuft man Gefahr mit falschen werten zu rechnen und die Stellen an sich fallen nicht auf.

Dazu einen Unittest der alle enums (gueltigen Optionen) testet und man ist immer auf der sicheren seite


----------



## faetzminator (23. Dez 2011)

VfL_Freak hat gesagt.:


> Nein, besser als leeren String initialisieren !!



Das ist wieder eine Verallgemeinerung. Ich würde in diesem Fall (abgesehen davon, dass ich eine Exception schmeissen würde) sicher nicht [c]""[/c] an Stelle von [c]null[/c] zurückgeben. Wenn du/ihr in deinen/euren Projekten nicht unterscheiden könnt, wann etwas nicht vorhanden ([c]null[/c]), und wann etwas leer (sei es nun String, List, ...) sein muss, dann ist das nicht unser Problem :bae:


----------



## VfL_Freak (23. Dez 2011)

Moin,



faetzminator hat gesagt.:


> Das ist wieder eine Verallgemeinerung. Ich würde in diesem Fall (abgesehen davon, dass ich eine Exception schmeissen würde) sicher nicht [c]""[/c] an Stelle von [c]null[/c] zurückgeben. Wenn du/ihr in deinen/euren Projekten nicht unterscheiden könnt, wann etwas nicht vorhanden ([c]null[/c]), und wann etwas leer (sei es nun String, List, ...) sein muss, dann ist das nicht unser Problem :bae:



Zumindest die letzten fünf Worte kann ich voll inhaltlich unterschreiben 

Gruß
Klaus


----------

