# else if und return



## Lexi (23. Nov 2008)

Ich möchte, je nachdem ob eine, oder die andere Bedingung zutrifft einen Wert zurückgeben.
Wenn ich untenstehenden Code compiliere, sagt er mit ihm fehle ein "return statement".
Was habe ich falsch gemacht und wie muss ich meinen Quelltext abändern, damit ich was zurückgeben kann?


```
public String gibString()
    {
        String x = "Hallo";
        String y = "Tschuess";
        String z = "Blubb";
        
        if(false)
        {
            return x;
        }
        
        else if(true)
        {
            return y;
        }
        
        else
        {
            return z;
        }
    }
```


----------



## L-ectron-X (23. Nov 2008)

Der Code wird auch dann nicht funktionieren, wenn du das Problem gelöst hast.
Du hast nur zwei Zustände, auf die du prüfen willst/kannst. _Ja_ oder _Nein_. _true_ oder _false_. Aber du willst einen von drei möglichen Strings zurück geben können...

Die Fehlermeldung bekommst du weg, wenn du den else-Block entfernst und nur _return z;_ schreibst.
Das Ganze bleibt dennoch sinnfrei.


----------



## Lexi (23. Nov 2008)

Dann war das ein blödes Beispiel. Ich poste mal ein Auszug aus meinem Quelltext, dann wirds vllt deutlicher.
Das mit true oder false war ungünstig. Es gibt mehr als 2 Bedingungen in meiner Abfrage.


```
public String gibfeldInf()
    {
        if(u.gibxhPos()==0&&u.gibyhPos()==0) 
        {
            feldnr1="120";
            return feldnr1;
        }
        
        else if(u.gibxhPos()==50&&u.gibyhPos()==0)
        {
            feldnr2="220";
            return feldnr2;
        }
        else if(u.gibxhPos()==100&&u.gibyhPos()==0)
        {
            feldnr3="320";
            return feldnr3;
        }
        else if(u.gibxhPos()==150&&u.gibyhPos()==0)
        {
            feldnr4="420";
            return feldnr4;
        }

        //Hier kommen noch weitere Bedingungen
    }
```


----------



## L-ectron-X (23. Nov 2008)

```
public String gibfeldInf() 
    { 
        if(u.gibxhPos()==0&&u.gibyhPos()==0) 
        { 
            feldnr1="120"; 
            return feldnr1; 
        } 
        
        else if(u.gibxhPos()==50&&u.gibyhPos()==0) 
        { 
            feldnr2="220"; 
            return feldnr2; 
        } 
        else if(u.gibxhPos()==100&&u.gibyhPos()==0) 
        { 
            feldnr3="320"; 
            return feldnr3; 
        } 
        else if(u.gibxhPos()==150&&u.gibyhPos()==0) 
        { 
            feldnr4="420"; 
            return feldnr4; 
        } 
        
        return null; //es gibt keine Übereinstimmung
    }
```

Zur Prüfung der Rückgabe im der Methode/Klasse, die die Rückgabe abholt, sollte jetzt aber auf null geprüft und entsprechend darauf reagiert werden. Sonst kann durch aus eine NullpointerException bei dem Zugriff auf den Rückgabewert geworfen werden.
Möglich wäre auch die Rückgabe eines Leerstrings oder eines Strings mit einem ganz bestimmten Wert.
Aber auch hier sollte das Ergebnis nochmal überprüft werden, damit das Programm nicht mit sinnlosen Werten arbeitet.


----------



## Marco13 (23. Nov 2008)

Der erste Beitrag erinnert mich an http://java-forum.org/de/viewtopic.php?p=266547&highlight= :lol:

Wie auch immer - deutlicher wird's dadurch nicht unbedingt. Wenn die ganzen feldnrX-Variablen Instanzvariablen sind, sieht das sehr schräg aus. 

Vermutlich wäre eine Lösung des Problems, ganz am Ende sowas zu machen wie

```
....
    System.err.println("Keine Bedinung traf zu!");
    return "UNGÜLTIG"; // Oder so...
}
```
aber wie gesagt: Insgesamt sieht das ziemlich fragwürdig aus...


----------



## Lexi (24. Nov 2008)

Ich habe jetzt am Ende einfach ein _return""_ eingefügt und es funktioniert. =)

Dann habe ich jezz eine weitere Frage. Dazu greife ich doch nochmal auf das erste Beispiel zurück, weil das ein wenig allgemeiner ist.

Die Methode _gibString()_ setzt die Variable z auf "Blubb". Danach möchte ich mit der Methode _gibz()_ den Wert von z zurückgeben. Das funktioniert prima. 
Jetzt möchte ich aber die _gibz()_ Mehtode in einer anderen Klasse ausführen und ich bekomme "null" zurückgegeben. Das heißt ja das dazwischen irgendwo meine z Variable auf "null" gesetzt wurde, oder ? Wieso ? Und wie verhindere ich das ?



```
public class Test
{  
    String x;
    String y;
    String z;
    
    public Test()
    {
    }
    
    public String gibString() 
    { 
        
        if(9==11) 
        { 
            x = "Hallo";
            return x; 
        } 
        
        else if(9==10) 
        { 
            y = "Tschuess"; 
            return y; 
        } 

        else if(9==9)
        {
            z = "Blubb"; 
            return z;
        }
        return "UNGÜLTIG";
    }
    
    public String gibz()
    { return z;}
```


```
public class Test2
{ Test t;
    public Test2()
    {
        t= new Test();
    }

    public void gibzaus()
    {
        String z=t.gibz();
        System.out.println("Das ist z : "+z);
    }
}
```


----------



## SlaterB (24. Nov 2008)

wahrscheinlich rufst du die Methode an einem anderen Objekt der gleichen Klasse auf,
unterschiedliche Objekte haben unterschiedliche Werte,

das ist kein Bug, sondern ein Feature,
sonst hätten ja alle Person-Objekte in einem Java-Telefonbuch den gleichen Namen und die gleiche Telefonnummer 

du musst das fragliche Objekt mitübergeben


----------



## Wildcard (24. Nov 2008)

Ein Getter darf niemals Werte setzen, in dieser Form wäre dein Programm katastrophal


----------



## hdi (24. Nov 2008)

```
public void gibzaus()
    {
        // ----------->  t.gibString()  <--------------
        String z=t.gibz();
        System.out.println("Das ist z : "+z);
    }
```
füg mal die gibString() methode ein wie oben im Code zu sehen. Du initialisiert die Variable "z" der Klasse Test ja gar nicht:


```
class Test{

String z; // <- standardmässig "null", wenn man jetzt keinen Wert setzt

//...
}
```


----------



## Lexi (24. Nov 2008)

SlaterB hat gesagt.:
			
		

> wahrscheinlich rufst du die Methode an einem anderen Objekt der gleichen Klasse auf,
> unterschiedliche Objekte haben unterschiedliche Werte,
> 
> das ist kein Bug, sondern ein Feature,
> ...



Da stehe ich grad ein wenig auf dem Schlauch -.- Wie übergebe ich das Objekt ?



> Ein Getter darf niemals Werte setzen, in dieser Form wäre dein Programm katastrophal



d.h. ich sollte daraus 2 Methoden machen? Eine die, die Werte setzt und eine die diese dann abruft ?


----------



## L-ectron-X (24. Nov 2008)

Bei Objekterzeugung sind deine String-Instanzvariablen null, ihnen wird kein Wert zugewiesen.
Wenn du nun auf deiner Test-Referenz gibz() aufrufst, wird der Wert vom nicht initialisiertem String z zurückgegeben.
Wenn z einen Wert haben soll, musst du vorher noch t.gibString() aufrufen.


----------



## hdi (24. Nov 2008)

genau hatte mich doch nich verlesen xD Siehe meinen Post weiter oben..


----------



## Lexi (24. Nov 2008)

Jungs, ihr seid Gold wert  Danke sehr.


----------



## Leroy42 (24. Nov 2008)

L-ectron-X hat gesagt.:
			
		

> Die Fehlermeldung bekommst du weg, wenn du den else-Block entfernst und nur _return z;_ schreibst.



Also statt:


```
public String gibString()
    {
        String x = "Hallo";
        String y = "Tschuess";
        String z = "Blubb";
        
        if(false)
        {
            return x;
        }
        
        else if(true)
        {
            return y;
        }
        
        else
        {
            return z;
        }
    }
```

das schreiben:


```
public String gibString()
    {
        String x = "Hallo";
        String y = "Tschuess";
        String z = "Blubb";
        
        if(false)
        {
            return x;
        }
        
        else if(true)
        {
            return y;
        }
        
        else
            return z;
    }
```

 ???:L 

Wie kommst du denn darauf?  :shock:


----------



## L-ectron-X (24. Nov 2008)

@Leroy42: Nee, nicht so!
So:

```
public String gibString()
    {
        String x = "Hallo";
        String y = "Tschuess";
        String z = "Blubb";
       
        if(false)
        {
            return x;
        }
       
        else if(true)
        {
            return y;
        }

        return z;
    }
```
Wobei der Code blöde ist. Hab ich aber oben schon gesagt.


----------

