[JAVA] Zurückspringen im Code

12/23/2012 16:55 Warnuk3r#1
Hallo!

Und zwar habe ich folgende Frage...

Ich möchte ein Programm (in Java) programmieren, dass Daten einer Person erfassen kann, sie in einer Textdatei abspeichern/auslesen kann usw..

Wenn ich also im Menü bin..

Person aufnehmen<1>
Personen auflisten<2>

und mich dafür entscheide, eine Person aufzunehmen gelange ich in das "Formular", in dem ich den Namen etc. eingeben kann. Anschließen soll der Person eine Möglichkeit gegeben werden, noch eine weitere Person aufzunehmen oder wieder zurück zum Menü zu gelangen.

Wie bekomme ich das hin? Ich würde gerne irgendwie wieder zurück an die Stelle im Code gehen, wo das Menü war. Dass es sich sozusagen wiederholt...

Dies habe ich glaube mal in C++ mit einer Do-While-Schleife gelöst oder so ist aber schon lange her, weshalb ich mich nicht mehr darin erinnern kann wie das genau ging.

PHP Code:
import java.io.*;

class 
person {
    
// Variablen
    
private static BufferedReader persEingabe = new BufferedReader(new InputStreamReader(System.in));
    private 
String nachname;
    private 
String vorname;
    private 
String anrede;
    private 
String email;

    
// Setter-Methoden
    
public void setNachname(String pBr) {
            
this.nachname pBr;
    }

    public 
void setVorname(String pBr) {
                
this.vorname pBr;
    }

    public 
void setAnrede(String pBr) {
                
this.anrede pBr;
    }

    public 
void setEmail(String pBr) {
                
this.email pBr;
    }

    public 
void addPers() {
                try {
                    
System.out.println("\nGeben Sie bitte die Daten ein:\n");

                    
System.out.println("     Name:");
                    
this.setNachname(persEingabe.readLine());

                    
System.out.println("  Vorname:");
                    
this.setVorname(persEingabe.readLine());

                    
System.out.println("   Anrede:");
                    
this.setAnrede(persEingabe.readLine());

                    
System.out.println("    eMail:");
                    
this.setEmail(persEingabe.readLine());

                    
System.out.println("\n\t\tStimmts (J/N)");
                    
String jnEingabe StdInput.readString("Eingabe: ");

                    if (
jnEingabe == "N" || jnEingabe == "n") {
                        
// Korrektur der Daten
                        
this.addPers();

                        } else if (
jnEingabe == "J" || jnEingabe == "j") {
                            
System.out.println("\tNoch eine Person aufnehmen? (J\\N)");
                            
jnEingabe StdInput.readString("Eingabe: ");

                            if (
jnEingabe == "N" || jnEingabe == "n") {
                            
//displayMenu();
                        
} else {
                            
this.addPers();
                            }
    }
                    }
                    catch (
IOException e) {
                    }
    } 
// addPers
// person 
PHP Code:
public class Projekt {

    public static 
void displayMenu() {

        
// Menü
        
System.out.println("      \nKontaktverwaltung");

        
System.out.println("\nMöchten Sie...\n");

        
System.out.println("       eine Person aufnehmen: > 1");
        
System.out.println("               Einträge auflisten: > 2");
        
System.out.println("                 Datei speichern: > 3");
        
System.out.println("    Personen aus Datei laden: > 4");
        
System.out.println("                  Datei loeschen: > 5");
        
System.out.println("      das Programm verlassen: > 6");

        
int mEingabe StdInput.readInt("Eingabe :");

        switch(
mEingabe) {
            case 
1:
                
//person.addPers(); Problem!
            
break;
            case 
2:
                
// Auslesen
            
break;
            case 
3:
                
// PrintWriter
            
break;
            case 
4:
                
// Scanner
            
break;
            case 
5:
                
// Delete file
            
break;
            default:
                
System.out.println("Ungueltige Eingabe!");
        }
    } 
// Menu

    
public static void main(String [] args) {
        
person p1[] = new person[6];
        
displayMenu();
    }

Mfg Wr3
12/23/2012 18:09 Eerox#2
du könntest es mit flags probieren um die main damit in einer endlosschleife auszuführen.

zb du willst ins menü->menüflag auf 1 setzen.wenn du aus dem menü willst setzt du es wieder auf 0 und springst wieder in den ausgangspunkt
12/23/2012 18:15 Obilee#3
Ein "GoTo" gibt es in Java nicht, aus gutem Grund.

Man kann jedoch wenn man unbedingt will sowas zaubern:

Code:
loops:
for (int i = 0; i < MAX_I; i++) {
    for (int j = 0; j < MAX_J; j++) {
        // do stuff
        break loops;
    }
}
Bei deinem Beispiel wär es aber sinnvoller "displayMenu()" in eine While(true) zu packen die erst beendet wird wenn jmd. "das Programm verlassen" auswählt. Ansonsten wiederholt es die Anfrage was man eingeben möchte unendlich oft.
12/23/2012 18:18 Eerox#4
Code:
loops:
for (int i = 0; i < MAX_I; i++) {
    for (int j = 0; j < MAX_J; j++) {
        // do stuff
        break loops;
    }
}

bei diesem break handelt es sich um das gleiche wie das continue; in c++?
12/23/2012 18:31 Warnuk3r#5
Quote:
Originally Posted by Obilee View Post
Ein "GoTo" gibt es in Java nicht, aus gutem Grund.

Man kann jedoch wenn man unbedingt will sowas zaubern:

Code:
loops:
for (int i = 0; i < MAX_I; i++) {
    for (int j = 0; j < MAX_J; j++) {
        // do stuff
        break loops;
    }
}
Bei deinem Beispiel wär es aber sinnvoller "displayMenu()" in eine While(true) zu packen die erst beendet wird wenn jmd. "das Programm verlassen" auswählt. Ansonsten wiederholt es die Anfrage was man eingeben möchte unendlich oft.
Das hab ich auch schon gesehen, aber ich habe 2 Dateien, also müsste ich boolean weiter = true; auch in beiden Dateien rein packen, was ja eigentlich kein eleganter Weg wäre, oder? Vor allem, wenn das eigentlich nichts mit der Klasse "person" zutun hat...!?

Außerdem müsste ich dann ja noch die Konsole clearen und erneut die Ausgabe machen (also die Schleife). Bei C++ damals habe ich glaube ich immer gesehen, als ich so etwas ausprobiert habe. Kann ja auch keine elegante Lösung sein, oder?
12/23/2012 18:39 .Infinite#6
Quote:
bei diesem break handelt es sich um das gleiche wie das continue; in c++?
"continue" und "break" sind nicht das Gleiche:
- "continue" bricht den aktuellen Schleifendurchlauf ab
- "break" bricht die Schleife ab
12/25/2012 14:56 niko_d#7
du kannst displayMenu() ein rückgabewert zurückgeben lassen.
also public static boolean displayMenu(), dann bei case 6 oder so return false
und bei default: return true.

in der main methode
while(dispayMenu())
{
}

edit: hab gerade gesehen, dass du das Menu nur 1x anzeigen möchtest.
Dafür musst dann nur den System.out.print teil in eine eigene Methode schreiben
und den Input/switch-case teil in eine andere und diesen dann in der schleife immer
wieder aufrufen.
12/25/2012 18:20 Warnuk3r#8
Also das Menü soll halt immer wieder angezeigt werden, wenn man zurück ins Menü kommt.

Menü -> Person aufnehmen -> Menü

Und dann ist man ganz normal wieder im Menü^^

Soweit ich das nun kapiert habe, mache ich das einfach mit einer While-Schleife und lass es ausgaben + Konsole clearen, da es mir ja sonst alles voll spammen würde.