# return-Anweisung am Beispiel eines Palindroms



## Katzenstreik (1. Jan 2011)

Hallo zusammen,

ich habe ein generelles Verständnis-Problem mit der return-Anweisung.

Ich habe eine Methode geschrieben die Palindrome erkennt. Jetzt geb ich per System.out.print aus, ob es sich um eines handelt oder nicht (Theoretisch könnt ich das auch mit true/false als Rückgabewert tun, aber ich möchte genau diese return-Anweisung mal verstehen)

Meine Frage: Warum muss ich den String am Ende der Methode zurückgeben? Wenn ich zum Beispiel die Methode mit void formuliere schmeisst der mir den Fehler das ein String ein return erwartet.
Wozu also brauche ich den return-Wert, wenn ich doch auch ohne ihn bestimmen kann, dass der String ein Palindrom ist oder eben nicht.

Hier einmal mein Code

```
public static String pal(String palindrom){
		
		int j = 0;
		int i=palindrom.length()-1;
		while ( i >j){
			if (palindrom.charAt(j)!= palindrom.charAt(i)){
				System.out.println ("Nein");}	
			else {
				i--;
				j++;}
		}
		System.out.println ("Ja!!!!");	
		return palindrom;
}
	
	
    public static void main(String [] args)
    {

     
       String palindrom = "otto";

       System.out.print (pal(palindrom));
      
    }

}
```

Danke für Eure Antworten!


----------



## eRaaaa (1. Jan 2011)

Katzenstreik hat gesagt.:


> Meine Frage: Warum muss ich den String am Ende der Methode zurückgeben? Wenn ich zum Beispiel die Methode mit void formuliere schmeisst der mir den Fehler das ein String ein return erwartet.




Mhm? Du musst erst einmal gar nichts  Du bestimmst ob etwas zurückgegeben werden soll oder nicht. Wenn du allerdings void sagst, muss natürlich die Zeile 13 raus, weil mit return sagst du ja gerade gebe zurück...Und das System.out in Zeile 23 muss dann auch raus, weil was soll System.out denn printen wenn nichts zurückgegeben werden soll?
Deine Methode ist auch nicht optimal, du hast eine Endlosschleife wenn es kein Palindrom ist 
Wenn deine eigentliche Frage aber ist, wofür ein return ist, ich denke das steht in wirklich jedem Java-Buch, du musst schon konkret sagen wo da deine Verständnisprobleme sind


----------



## XHelp (1. Jan 2011)

Vermutlich willst du eine Methode schreiben, die überprüft, ob ein String ein Palindrom ist oder nicht. Dann solltest du vllt eher boolean zurückgeben.


----------



## Katzenstreik (1. Jan 2011)

stimmt, eine Endlosschleife...

Hatte vorher auch mit boolean gearbeitet. Mir gehts nur ums Verständnis.

Also durch das System.out.print aus Zeile 23 hatte er trotz Angabe von void noch einen return Wert erwartet. Das ist also geklärt, Danke dafür! 

Mein Verständnisproblem ist, wozu ich einen Rückgabewert brauche? Am Beispiel meines Palindroms wird der String der Methode übergeben und somit kann die Methode damit arbeiten, aber wieso muss der anschließend wieder zurückgegeben werden? Wozu brauche ich den, oder welcher Bestandteil meines Programms braucht den?

Gibt es Programmbeispiele, die unbedingt einen return Wert zurückgegeben haben müssen und im Gegensatz dazu Programme die keinen benötigen?


----------



## Illuvatar (1. Jan 2011)

Der Einzige der wissen kann ob da ein return hin soll oder nicht, bist du selber  Aber du musst dich einmal dafür entscheiden was die Methode machen soll und dabei bleiben.
Wnen du sagst, die Methode soll von sich aus die Ausgaben auf System.out machen und nichts zurückgeben, dann macht das print in Zeile 23 natürlich keinen Sinn mehr.
Du könntest die Methode aber auch so ändern dass sie einen String "Palindrom" bzw "kein Palindrom" zurückgibt - dann hast du kein print mehr in der Methode, brauchst aber wieder das print in Zeile 23.
Stattdessen wären in dem Fall dann aber booleans der logischere Weg.

Den am Anfang übergebenen String wieder zurückzugeben ist aber unnötig, wie du schon festgestellt hast


----------



## Katzenstreik (1. Jan 2011)

heisst das so viel wie, wenn ich will dass er mir einen Wert zurückgeben soll, dass ich damit überprüfen kann, ob mein Code funktioniert?

Um der Endlosschleife entgegenzuwirken habe ich hinter Zeile 7 folgendes eingefügt:

```
return palindrom;
```

Nun läuft sie nicht mehr endlos. Kann ich also davon ausgehen, dass sobald etwas zurückgegeben wird die Methode nicht weiterarbeitet?

Danke für eure Geduld


----------



## XHelp (1. Jan 2011)

Katzenstreik hat gesagt.:


> heisst das so viel wie, wenn ich will dass er mir einen Wert zurückgeben soll, dass ich damit überprüfen kann, ob mein Code funktioniert?


Nein, mit der Überprüfung hat das nichts zu tun. Du musst doch wissen, ob du etwas zurückhaben willst oder nicht. Eine Methode, die eine Zahl berechnet könnte sinnvollerweise diese Zahl zurückgeben. Eine Methode, die einfach nur irgendwas auf die Konsole schreibt, braucht nicht unbedingt eine Rückgabe.


> Kann ich also davon ausgehen, dass sobald etwas zurückgegeben wird die Methode nicht weiterarbeitet?


Im Grunde kannst du es fürs erste so hinnehmen. Da gibt es zwar noch eine Sache mit den finally-Block, ist aber am Anfang eigentlich irrelevant.


----------



## Katzenstreik (1. Jan 2011)

ok, langsam schepperts

nur stellt sich mir immer noch die Frage, warum ich den Wert zurückgebe. Theoretisch könnte ich wenn ich a+b=ergebnis berechne auch ergebnis mit system.out.print auf der konsole ausgeben und sehe den berechneten Wert. Nur wo ist der Unterschied zur return-Anweisung? Der Wert wird und bleibt doch in ergebnis gespeichert. Worauf ich hinaus will ist, dass return und System.out.println für mich dasselbe sind, bis ich eines besseren belehrt wurde


----------



## XHelp (1. Jan 2011)

Katzenstreik hat gesagt.:


> Worauf ich hinaus will ist, dass return und System.out.println für mich dasselbe sind, bis ich eines besseren belehrt wurde



Du hast ein Konto bei einer Bank. Die freundliche Mitarbeiterin sagt dir zwar jedes mal fleißig "sie haben 10000 € auf dem Konto" (System.out.print), aber wenn du das Geld haben willst (return), dann sagt sie: "nö, das geht nicht: nur gucken, nicht anfassen"... Ist eine ziemlich witzlose Bank, meinst du nicht?
Es kommt eben drauf an, was du erreichen willst. Wenn du dein Ergebnis auswerten willst, dann brauchst du ein Ergebnis. Und wenn du einfach nur System.out.println machst, dann kannst du ja damit nichts mehr anstellen. Auch darüber hinaus: return und System.out.println sind völlig unterschiedliche Sachen, die lassen sich in keiner Weise vergleichen. Ließ einfach mal in einem Java-Buch nach, was es mit return auf sich hat.


----------



## Katzenstreik (1. Jan 2011)

> Die return-Anweisung beendet die Methode und übergibt die Kontrolle an die
> aufrufende Methode zurück.
> Ist ein Ausdruck angegeben, wird dieser zuerst ausgerechnet und dieser
> Wert als Ergebniswert zurückgegeben. Der Ausdruck muss typkompatibel
> ...



Solche Erklärungen finde ich, wenn ich danach suche, aber die sind (für mich) nicht ausreichend.

Wenn ich also einen Wert (in meinem Fall an die main-Methode) zurückgebe, dann kann die main-Methode damit weiterarbeiten (ggf. auch weitere Untermethoden)? 
Ist das der Sinn und Zweck?

Und wenn ich keinen Wert zurückgebe, dann weiss nur die Methode in der der Wert berechnet wurde, welchen Wert die Variable (In meinem Fall: ergebnis) hat?


----------



## XHelp (1. Jan 2011)

Die Erklärung ist doch ok...
Aber ich weiß ehrlich zu sein nicht, wo genau dein Problem liegt. Return gibt etwas zurück, kein return gibt nichts zurück. Willst du was zurückgeben, musst du in der Methodendeklaration den Typ angeben, willst du nichts zurückgeben, musst du void verwenden.
Deine Fragen kann man so ohne weiteres nicht mit Ja/Nein beantworten:
- Wenn du eine Methode mit Rückgabe in der Main ausführst, dann wird da ein Wert zurückgegeben. Was du damit anstellst ist deine Sache.
- Nein, d.h. nur, dass diese Methode nichts zurückgibt. Die kann ja irgendwelche globalen Variablen o.ä. verändern.

In manchen Sprachen heißt eine void-Methode - Prozedur und einie Methode mit Rückgabe - Funktion. Vllt sagen dir die 2 Wörter mehr...


----------



## Katzenstreik (1. Jan 2011)

mein Problem ist, dass ich nicht weiß was ich mit einem Rückgabewert anfangen könnte.

Vlt fehlt mir einfach ein praktisches Beispiel, dass mir zeigen würde wenn ich in einer Methode a+b=ergebnis berechne und ergebnis dann zurückgebe, was ich mit ergebnis anfangen kann. 

Hast du so ein Beispiel auf die schnelle? 

Danke nochmals!


----------



## tommysenf (1. Jan 2011)

```
int quadrat(int x) {
  return x*x;
}

public static void main(String[] args) {

    int quadrat1 = quadrat(2);
    int quadrat2 = quadrat(4);

    System.out.println(quadrat1 + quadrat2);

}
```


----------



## Davide (1. Jan 2011)

Das Beispiel mit dem Konto ist sehr verständlich. Mit dem Resultat von a+b gibt es nicht mehr viele Möglichkeiten was man damit machen kann, als es zu speichern um damit weiter zu rechnen oder auszugeben.

Hier mal die Geschichte mit dem Konto als einfaches Beispiel.

[Java]
public class Konto {

    private double bestand;

    public Konto(double bestand) {

        this.bestand = bestand;
    }

    public void setGeld(double amountOfMoney) {

        bestand += amountOfMoney;
    }

    public double getGeld(double amountOfMoney) {

        bestand -= amountOfMoney;

        return amountOfMoney;
    }

    public void printKontoInfo() {

        System.out.println("Aktueller Kontobestand: " + bestand);
    }
}
[/Java]

[Java]
public class Brieftasche {

    private double geld;

    public Brieftasche(double geld) {

        this.geld = geld;
    }

    public void setGeld(double amountOfMoney) {

        geld += amountOfMoney;
    }

    public double getGeld(double amountOfMoney) {

        geld -= amountOfMoney;

        return amountOfMoney;
    }

    public void printInfoBrieftasche() {

        System.out.println("Geld in der Brieftasche: " + geld);
    }
}
[/Java]

[Java]
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        Konto meinKonto = new Konto(200);
        Brieftasche meineBrieftasche = new Brieftasche(0);

        meinKonto.printKontoInfo();
        meineBrieftasche.printInfoBrieftasche();

        double abgehobenesGeld = meinKonto.getGeld(100);
        meineBrieftasche.setGeld(abgehobenesGeld);

        meinKonto.printKontoInfo();
        meineBrieftasche.printInfoBrieftasche();
    }

}
[/Java]


----------



## Katzenstreik (1. Jan 2011)

danke für das gute Beispiel.

Ich verstehe das jetzt so, dass die Klasse Konto den Geldbetrag der abgehoben wird mit return an die main methode ZURÜCKGIBT und die main-methode ÜBERGIBT den zurückgegeben Wert an die Klasse Brieftasche.

Ich hatte vorhin mal die Vermutung angestellt, das ein Wert dann zurückgegeben werden sollte (An die main methode z.b.), damit andere Klassen damit arbeiten können. Also wenn ich das Beispiel sehe, dann passiert doch genau das?!?


----------



## Davide (1. Jan 2011)

Ja, wenn ich es erklären müsste, ist der Sinn eines Rückgabewerts, einen Wert zu erhalten um damit weiterarbeiten zu können. Einen Rückgabewert entgegenzunehmen und dann einfach nur auszugeben, dass kann die Methode auch ruhig ohne Rückgabewert machen.


----------



## XHelp (1. Jan 2011)

Davide hat gesagt.:


> Einen Rückgabewert entgegenzunehmen und dann einfach nur auszugeben, dass kann die Methode auch ruhig ohne Rückgabewert machen.



Und wie schreibst du für diese Methode einen Test? Wenn die Methode irgendwas berechnet, dann soll sie auch nur irgendwas berechnen. Ausgabe ist was ganz anderes und man sollte nicht alles in ein Topf schmeißen.


----------



## Katzenstreik (1. Jan 2011)

ok, dann belass ich es dabei und behaupte ich habe es verstanden 

Danke an alle Kommentatoren!


----------



## Davide (1. Jan 2011)

XHelp hat gesagt.:


> Und wie schreibst du für diese Methode einen Test? Wenn die Methode irgendwas berechnet, dann soll sie auch nur irgendwas berechnen. Ausgabe ist was ganz anderes und man sollte nicht alles in ein Topf schmeißen.



Da geb ich dir Recht. Ich wollte nicht alles in einen Topf schmeissen, bei dem simplen Beispiel mit einer Berechnung von a+b und ich will das Resultat nur ausgeben, spielt es keine Rolle meiner Meinung nach ob ich das Resultat direkt in der Methode ausgeben lasse oder den Rückgabewert ausgebe.


----------

