# zu einer Zeile zürück springen



## joni (25. Feb 2010)

Hallo,

wie kann man zu einem Punkt im Programm zurück gehen, ich habe zum Beispiel eine else andweisung und wenn der user eine falsche Eingabe gemacht hat kommt folgendes:

.... 
else	
	
	
	
	





```
System.out.println("Du hast '" + eingabe + "' geschrieben. Hast du dich vertippt? Versuch es nochmal!");
				
			System.exit(0);
```
und dann soll er zurück zum Anfang gehen und den ablauf von vorne starten. 

ich hab was von try-catch gelesen aber nicht verstanden.

und eben anstatt dem System.exit(0); will ich dsa er wieder von oben beginnt mit der benutzereingabe.

Vielen Dank schonmal.

Grüsse


----------



## Sempah (25. Feb 2010)

sowas wie goto benutzt man nicht mehr.
Pack es in eine while-Schleife, die solange läuft bis die korrekte Eingabe getätigt wurde.


----------



## joni (25. Feb 2010)

Danke schonmal für die Antwort, ich habs mal versucht aber komm nicht ganz klar:

also hier mal mein Code:


```
//**//Input Stein, Schere Papier oder Beenden//**//
		String eingabe = StdInput.readString("Ihre Wahl von Schere, Stein, Papier oder Beenden: ");
		
		//**//Eingabe Lesen und gegebene Aktion ausführen//**//Beenden
		if (eingabe.equalsIgnoreCase("Beenden")){
			System.out.println("      Siege des Computers: " + winspc );
					System.out.println("      Siege des Spielers:  " + winsme );
							System.out.println("Danke für das Spiel!");
			System.exit(0);
    	}
		//**//Eingabe Lesen und gegebene Aktion ausführen//**//Schere
            else if(eingabe.equalsIgnoreCase("Schere")){
    			System.out.println("Du hast " + eingabe + " gezogen und ich zog ..." + zufall );
    			System.out.println("*****" + " hat gewonnen*****");
            } 
		//**//Eingabe Lesen und gegebene Aktion ausführen//**//Stein
            else if(eingabe.equalsIgnoreCase("Stein")){
    			System.out.println("Du hast " + eingabe + " gezogen und ich zog ..." ); 
    			System.out.println("*****" + " hat gewonnen*****");
            }
		//**//Eingabe Lesen und gegebene Aktion ausführen//**//Papier
            else if(eingabe.equalsIgnoreCase("Papier")){
    			System.out.println("Du hast " + eingabe + " gezogen und ich zog ..." );
    			System.out.println("*****" + " hat gewonnen*****");
    	    }
            
		//**//Schreibfehler Notification//**//
    				else	System.out.println("Du hast '" + eingabe + "' geschrieben. Hast du dich vertippt? Versuch es nochmal!");
				
			System.exit(0);
```

und ich habe versucht es mit der while schleife zu machen 

```
while (eingabe != "Beenden", "Schere", "Stein", "Papier"){
			xxxxx	
				
			}
```

aber irgendwie komm ich da nicht hin das es es nimmt weil das != geht nicht, wie kann ich das lösen?

und bei xxxxx was muss ich da rein schreiben dass er wieder von oben beginnt ?

in der doku steht da immer nur System.out.prinln(x); aber dass will ich ja nicht

sorry bin echt newb


----------



## Michael... (25. Feb 2010)

Strings vergleicht man mit equals(...), ferner kann da nicht einfach auflisten, sondern muss einzelne Ausdrücke erstellen, die man logischen verknüpft:

```
while (!eingabe.equals("Beenden") && !eingabe.equals("Schere") ...)
```


----------



## nrg (25. Feb 2010)

Musst aber imho in der while-Bedingung keine Abfrage auf den Input machen (machst du doch schon im while-Body). Mach einfach eine Dauerschleife und verlasse sie, wenn "Beenden" eingegeben wird.

```
while (true) {
			String eingabe = StdInput.readString("Ihre Wahl von Schere, Stein, Papier oder Beenden: ");
			if (eingabe.equalsIgnoreCase("Beenden")){
				//do sth
				break;
			}
			// else ifs
			else {
				System.out.println("Falsche Eingabe");
			}
		}
```

zur besseren Lesbarkeit könntest auch einen boolean erstellen. z.b. boolean exit = false; while(!exit) {... und diesen dann eben auf true setzen, wenn das Programm beendet werden soll.


----------



## joni (25. Feb 2010)

Danke, das hat mir schonmal viel weiter geholfen. Nun aber bin ich immer noch nicht ganz dort wo ich will, ich habe es geschafft den loop zu machen und einfach eine "eingabe2" erstellt die das ganze nochmals abfragt aber kann mann das nicht ähnlich wie in einer batch datei machen wo man einfach sagt spring zurück zu punkt x

:anfang
blabla 

if errorlevel 1 goto anfang

kann man das nicht in ähnlichem style umsetzten?

sorry für die vielen fragen


----------



## faetzminator (25. Feb 2010)

Gotos sind böse und verursachen Spagetticode. Man könnte grundsätzlich von überall nach überall springen. Das _soll_ man aber nicht. Solcher Code ist schwer zu verstehen und zu debuggen.


----------



## nrg (25. Feb 2010)

Ich kenn StdInput nicht, deshalb hab ich das jetzt mal mit einen normalen BufferedReader gemacht um dir das kurz tu veranschaulichen. Versteh halt grad echt nicht, wo noch dein Problem ist, deshalb poste ich jetzt mal ein mögliches Grundgerüst:


```
import java.io.*;
public class Test {
	public static void main(String[] args) throws IOException  {
		BufferedReader bisr = new BufferedReader ( new InputStreamReader (System.in));
    	System.out.println("Type help for Help\n");
        while (true) {
        	System.out.print("Papier Stein Schere> ");
            String eingabe = bisr.readLine();
            if (eingabe.equalsIgnoreCase("Beenden")){
                //DO SOMETHING
                break;
            } else if (eingabe.equalsIgnoreCase("help")) {
            	printHelp();
            	//MORE ELSE IFS HERE
            } else {
                System.out.println("Falsche Eingabe. Bitte wiederholen!\n");
            }
        }
        bisr.close();
	}
	public static void printHelp() {
    	System.out.println(	"papier\t-\tWählt das Papier für das nächste Spiel\n" +
							"stein\t-\tWählt den Stein für das nächste Spiel\n" +
							"schere\t-\tWählt die Schere für das nächste Spiel\n"	+	
							"help\t-\tGibt die Hilfe aus\n");
	}
}
```
du kannst natürlich weiterhin deine Eingabe benutzen aber ich konnte es jetzt anders nicht testen.

edit: printHelp() kannst du ja noch selbst anpassen. Mir ist grad aufgefallen, dass ich beenden vergessen habe. Möglich wäre vllt auch noch score (gibt den aktuellen Punktestand aus). Da kannst du deiner Fantasie ja freien Lauf lassen . wie gesagt, sollte ja nur ein Grundgerüst sein (und für mein Empfinden ist es dafür eh schon zuviel )


----------



## stockhausen (25. Feb 2010)

Versuchs damit




```
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Test {

	public static void main(String[] args) throws IOException {		
		eingabe();		
	}
	
	public static void meineMethode(String eingabe) throws IOException {
		
		if("a".equals(eingabe)) {
			System.out.println("a gefunden");
		} else {
			eingabe();
		}
		
	}
	
	public static void eingabe() throws IOException {
		System.out.print("Eingabe: ");
		BufferedReader input = new BufferedReader ( new InputStreamReader (System.in));
		meineMethode(input.readLine().toLowerCase());
	}
	
}
```


Gruß,
Michael


----------



## joni (25. Feb 2010)

nrg, tausend Dank!!

jetzt habe ich es endlich verstanden, genau das habe ich gesucht. 

Ja das StdInput habe ich von meiner Schule bekommen, wieso auch immer...

Vielen Dank für die mühe und dass du das Gerüst für mich gemacht hast...


----------

