Eine Art Goto Befehl!

iB0T

Mitglied
Hallo, ich suche einen Befehl der es mir ermöglicht wieder zu dem Anfang eines programmblocks zu Springen!Also z.B. macht man viele if Abfragen und wenn eine falsch ist soll er wider zum Anfang der if Abfragen springen!

Danke schinmal im voraus!
 
Sowas braucht man nicht.
Zeig mal deinen Code und was genau du mit dem "Goto" bezwecken willst.
 
Java:
 //Passwort überprüfung
 if (pw1.equals(pw2)) {
	 //Ist das Alter eine Zahl?
	 if(var_Alter.matches("[0-9]+")){
		 
		 if(var_Vorname.matches("[A-Z]")) {
			 JOptionPane.showMessageDialog(null, "Regestrierung abgeschlossen"); 
		 }else{
			 
		 }
	 }else{
		 JOptionPane.showMessageDialog(null, "Dein Alter muss eine Zahl sein!");
	 }
	
	 
 }else{
	 JOptionPane.showMessageDialog(null, "Passwörter stimmen nicht überein.Bitte versuchen Sie es erneut!");
Wenn einer der Abfragen falsch ist(die ganzen Else habe ich jz nicht kopiert)
Soll er wider bei dem Code anfangen:
Java:
	 // Komponenten           
                JTextField Vorname = new JTextField();
                JTextField Zuname = new JTextField();
                JTextField Alter = new JTextField();
                JTextField Wohnort = new JTextField();
                JTextField Passwort = new JTextField();
                JTextField Passwort2 = new JTextField();
                
                Object[] message = {"Vorname", Vorname, 
                        "Zuname", Zuname , "Alter",Alter, "Wohnort", Wohnort,  "Passwort",Passwort , "Passwort wiederholen", Passwort2};
 
                JOptionPane pane = new JOptionPane( message, 
                                                JOptionPane.PLAIN_MESSAGE, 
                                                JOptionPane.OK_CANCEL_OPTION);
                pane.createDialog(null, "Regestrierung").setVisible(true);
 
Hm, ich kann da keine wirkliche Struktur erkennen.
Zumindest löst man sowas nicht mit gotos oder ähnlichem, sondern mit Methoden.
 
Wie kann ich das denn loösen , z.B das ich für den Code der immer wieder , bei einem Fehler, abgerufen werden soll eine neue Klasse mache & kann man dann den Code somit immer wider abrufen also das bei einem Fehler die neue Klasse wieder ausgeführt wird und bei einer Bestätigung wider in die andrer Klasse gewechselt wird!Ist das möglich oder hast du andere Ideen wie man sowas lösen könnt?
 
Einfach eine Methode schreiben, welche eine Validierung macht und je nach belieben einen oder mehrere Fehler zurückgibt. Kommt bei [c]Error validate()[/c] [c]null[/c] zurück, ist alles i.O., gleiches bei [c]List<Error> validate()[/c] [c]isEmpty()[/c] 😉

Edit: Der Aufrufer macht dann - abstrakt - natürlich so was:
Java:
List<Error> errors;
do {
    Data data = showSomeInputFormAndWait();
    errors = data.validate();
    showMightyMessages(errors);
} while (!errors.isEmpty());
 
Zuletzt bearbeitet:
Könntest du vielleicht ein kleines Code beisiel zu Veranschaulichung geben wäre nett😉

Ausserdem ist es nicht exakt das wonach ich gefragt habe.
Ich wilö das man Widder zum Anfang des Programmcodes springt, wenn ein Fehler aufritt, also falls die if bedingen nicht zutrifft soll im else Part stehen das er wieder zum Anfang des programmblocks springen
 
Zuletzt bearbeitet:
Ich versteh ehrlich gesagt überhaupt nicht was du überhaupt machen willst. Kannst du das nochmal erklären und soweit wie möglich vereinfachen?
 
Ertseinmal der Komplette Code:
Java:
import javax.swing.JOptionPane;
import javax.swing.JTextField;


public class main {
	public static void main(String[] args){
		JOptionPane.showMessageDialog(null, "Wilkommen beim iB0T Daten Service!");
		JOptionPane.showMessageDialog(null, "Version Alpha 1.0.0");
		
		
		 Object[] options = {"Login", "Regestrieren", "Website",};
	

		
            int select = JOptionPane.showOptionDialog(null,
                                                        "Wählen sie eine Option",
                                                        "Menü",
                                                        JOptionPane.DEFAULT_OPTION, 
                                                        JOptionPane.INFORMATION_MESSAGE, 
                                                        null, options, options[0]);
            if (select == 1) {
            	 // Komponenten           
                JTextField Vorname = new JTextField();
                JTextField Zuname = new JTextField();
                JTextField Alter = new JTextField();
                JTextField Wohnort = new JTextField();
                JTextField Passwort = new JTextField();
                JTextField Passwort2 = new JTextField();
                
                Object[] message = {"Vorname", Vorname, 
                        "Zuname", Zuname , "Alter",Alter, "Wohnort", Wohnort,  "Passwort",Passwort , "Passwort wiederholen", Passwort2};
 
                JOptionPane pane = new JOptionPane( message, 
                                                JOptionPane.PLAIN_MESSAGE, 
                                                JOptionPane.OK_CANCEL_OPTION);
                pane.createDialog(null, "Regestrierung").setVisible(true);
                
                //Strings 
 String var_Vorname = Vorname.getText();
 String var_Zuname = Zuname.getText();
 String var_Alter = Alter.getText();
 String var_Wohnort = Wohnort.getText();
 String pw1 = Passwort.getText();
 String pw2 = Passwort2.getText();
 //Passwort überprüfung

 if (pw1.equals(pw2)) {
	 //Ist das Alter eine Zahl?
	 if(var_Alter.matches("[0-9]+")){
		 
		 if(var_Vorname.matches("[A-Z]")) {
			 JOptionPane.showMessageDialog(null, "Regestrierung abgeschlossen"); 
		 }else{
			 
		 }
	 }else{
		 JOptionPane.showMessageDialog(null, "Dein Alter muss eine Zahl sein!");
	 }
	
	 
 }else{
	 JOptionPane.showMessageDialog(null, "Passwörter stimmen nicht überein.Bitte versuchen Sie es erneut!");
	 JTextField Vorname1 = new JTextField();
     JTextField Zuname1 = new JTextField();
     JTextField Alter1 = new JTextField();
     JTextField Wohnort1 = new JTextField();
     JTextField Passwort1 = new JTextField();
     JTextField Passwort21 = new JTextField();
     
     Object[] message1 = {"Vorname", Vorname1, 
             "Zuname", Zuname1 , "Alter",Alter1, "Wohnort", Wohnort1,  "Passwort",Passwort1 , "Passwort wiederholen", Passwort21};

     JOptionPane pane1 = new JOptionPane( message1, 
                                     JOptionPane.PLAIN_MESSAGE, 
                                     JOptionPane.OK_CANCEL_OPTION);
     pane1.createDialog(null, "Login").setVisible(true);
     String pw3 = Passwort1.getText();
     String pw4 = Passwort21.getText();
     
     if (pw3.equals(pw4)) {
    	 JOptionPane.showMessageDialog(null, "Regestrierung abgeschlossen");
 }else{
	 JOptionPane.showMessageDialog(null, "Sie haben das Passwot zu oft falsch eingegebn bitte starten sie iB0T neu!");
 }
                
 }
            }
		 
            }


            
		
	}

Alos wie ihr seht versuche ich eine Registrierung zu programmieren.Wenn eine der überprüften Sachen
(wie z.B. wenn das Alter keine Zahl ist) soll man wider zu dieser Stelle im programmcode zurückspringen!
Java:
	 // Komponenten           
                JTextField Vorname = new JTextField();
                JTextField Zuname = new JTextField();
                JTextField Alter = new JTextField();
                JTextField Wohnort = new JTextField();
                JTextField Passwort = new JTextField();
                JTextField Passwort2 = new JTextField();
                
                Object[] message = {"Vorname", Vorname, 
                        "Zuname", Zuname , "Alter",Alter, "Wohnort", Wohnort,  "Passwort",Passwort , "Passwort wiederholen", Passwort2};
 
                JOptionPane pane = new JOptionPane( message, 
                                                JOptionPane.PLAIN_MESSAGE, 
                                                JOptionPane.OK_CANCEL_OPTION);
                pane.createDialog(null, "Regestrierung").setVisible(true);
Dann ge es wieder von vorn los bis kein Fehler mehr Auftritt!

Und wenn ich schon dabei bin wie kann man oben einen Fehler einglebdn lassen also in dem "Registrierung" Screen (JOPtionPane)

Ich hoffe es ist jetzt verständlich
 
Es gilt zwar sonst als schelchter Stil, mehrere Returns zu haben, aber ...
Java:
void doit()
{
    while (!getValidInput());
}

boolean getValidInput()
{
    if (passwordWrong()) 
    {
        System.out.println("Password wrong");
        return false;
    }

    if (thisWrong()) 
    {
        System.out.println("This wrong");
        return false;
    }

    if (thatWrong()) 
    {
        System.out.println("That wrong");
        return false;
    }

    System.out.println("Everything fine");
    return true;
}
 
Du musst deinen Code erstmal besser strukturieren. Alles in einer Methode ist Käse. Mach viele kleine, die jeweils nur eine Aufgabe erfüllen. Dann kannst du die Lösung umsetzen, die faetzminator vorgeschlagen hat.
 
Ist meiner Meinung nach auch Geschmackssache, ich persönlich finde es auch angenehmer direkt zu sehen "oh hier ist die Methode sofort zuende".
 
Zuviele returns sollten es nicht sein, im Idelfall natürlich nur eins. In dem letzten Beispiel würde ich einfach für jeden Test eine eigene Methode schreiben und die dann in einer validateAll()-Methode aufrufen.
 
Zuviele returns sollten es nicht sein, im Idelfall natürlich nur eins. In dem letzten Beispiel würde ich einfach für jeden Test eine eigene Methode schreiben und die dann in einer validateAll()-Methode aufrufen.
Na generell habe ich dann entweder die Wahl zwischen 5x return oder 5 ineinander geschachtelten if-Abfragen, von der Lesbarkeit finde ich da ersteres wesentlich angenehmer. Man sieht dann auch, dass die Methode da zu Ende ist.
 
Habe jetzt alles Strukturiert!
Java:
import javax.swing.JOptionPane;
import javax.swing.JTextField;


public class main {
	
	//Willkommen und Variable Methoden
	public static void main(String[] args){
		JOptionPane.showMessageDialog(null, "Wilkommen beim iB0T Daten Service!");
		JOptionPane.showMessageDialog(null, "Version Alpha 1.0.0");
		
		//Variable Methoden
		
	}
	public static void selection(String[] args){
		
		 Object[] options = {"Login", "Regestrieren", "Website",};
	

		
            int select = JOptionPane.showOptionDialog(null,
                                                        "Wählen sie eine Option",
                                                        "Menü",
                                                        JOptionPane.DEFAULT_OPTION, 
                                                        JOptionPane.INFORMATION_MESSAGE, 
                                                        null, options, options[0]);
		}
	
	public static void register( int select){	
            if (select == 1) {
            	 // Komponenten           
                JTextField Vorname = new JTextField();
                JTextField Zuname = new JTextField();
                JTextField Alter = new JTextField();
                JTextField Wohnort = new JTextField();
                JTextField Passwort = new JTextField();
                JTextField Passwort2 = new JTextField();
                
                Object[] message = {"Vorname", Vorname, 
                        "Zuname", Zuname , "Alter",Alter, "Wohnort", Wohnort,  "Passwort",Passwort , "Passwort wiederholen", Passwort2};
 
                JOptionPane pane = new JOptionPane( message, 
                                                JOptionPane.PLAIN_MESSAGE, 
                                                JOptionPane.OK_CANCEL_OPTION);
                pane.createDialog(null, "Regestrierung").setVisible(true);
                
                //Strings 
 String var_Vorname = Vorname.getText();
 String var_Zuname = Zuname.getText();
 String var_Alter = Alter.getText();
 String var_Wohnort = Wohnort.getText();
 String pw1 = Passwort.getText();
 String pw2 = Passwort2.getText();
            }}
 //Passwort überprüfung
 public static void checkRegsiter(String var_Vorname, String var_Zuname , String var_Alter, String var_Wohnort, String pw1, String pw2){
 if (pw1.equals(pw2)) {
	 //Ist das Alter eine Zahl?
	 if(var_Alter.matches("[0-9]+")){
		 
		 if(var_Vorname.matches("[A-Z]")) {
			 JOptionPane.showMessageDialog(null, "Regestrierung abgeschlossen"); 
		 }else{
			 
		 }
	 }else{
		 JOptionPane.showMessageDialog(null, "Dein Alter muss eine Zahl sein!");
	 }
	
	 
 }else{
	 JOptionPane.showMessageDialog(null, "Passwörter stimmen nicht überein.Bitte versuchen Sie es erneut!");
	 JTextField Vorname1 = new JTextField();
     JTextField Zuname1 = new JTextField();
     JTextField Alter1 = new JTextField();
     JTextField Wohnort1 = new JTextField();
     JTextField Passwort1 = new JTextField();
     JTextField Passwort21 = new JTextField();
     
     Object[] message1 = {"Vorname", Vorname1, 
             "Zuname", Zuname1 , "Alter",Alter1, "Wohnort", Wohnort1,  "Passwort",Passwort1 , "Passwort wiederholen", Passwort21};

     JOptionPane pane1 = new JOptionPane( message1, 
                                     JOptionPane.PLAIN_MESSAGE, 
                                     JOptionPane.OK_CANCEL_OPTION);
     pane1.createDialog(null, "Login").setVisible(true);
     String pw3 = Passwort1.getText();
     String pw4 = Passwort21.getText();
     
     if (pw3.equals(pw4)) {
    	 JOptionPane.showMessageDialog(null, "Regestrierung abgeschlossen");
 }else{
	 JOptionPane.showMessageDialog(null, "Sie haben das Passwot zu oft falsch eingegebn bitte starten sie iB0T neu!");
 }
                
 }
            }
		 
	}

Mit welchen Befehl kann ich dann zu der Methode register springen?
 
Na generell habe ich dann entweder die Wahl zwischen 5x return oder 5 ineinander geschachtelten if-Abfragen, von der Lesbarkeit finde ich da ersteres wesentlich angenehmer.
Wer redet von geschachtelten if-Abfragen?

Java:
boolean validateAll() {
   return    checkName() 
           && checkAge() 
           && checkPassword() 
           && ...
 
Seit wann das? ???:L Habe ich was verpasst?

Nun, es gibt Puristen, für die break, continue und mehrere Returns Teufelszeug sind. Ich sehe das in solchen Fällen (!) auch nicht so eng: Es ist eine IMHO SEHR (!) übersichtliche und klar erkennbare Struktur. Schlimm finde ich selbst das nur, wenn die Blöcke komplexer werden und/oder irgendwo in tief verschachtelten ifs und Schleifen, am besten noch im "else" Teil hinter einem 30 Zeilen langen if-block kleine, unscheinbare returns, breaks oder continues versteckt sind. Das kann sehr leicht unübersichtlich und schwer nachvollziehbar werden.

Die besagten Puristen kommen dann entweder aus der C-Welt (wo sie auch anfangen zu schreien, wenn die main eine Zeile enthält, die KEIN Methodenaufruf ist), oder, das andere extrem: Es sind OOP-Fanbois, die statt der ifs und returns lieber von einem ConditionValidationService eine ConditionValidationFactory holen, die einen ConditionValidator erstellt, der dann die List<Condition> verarbeitet und eine ConditionValidationResponse erstellt, die von einem ConditionValidationResponseEvaluator ausgewertet wird und der dann ggf. eine ConditionResponseRejectionAction ausführt - aber alles ohne if und return 😀
 
Ich möchte nichts an meiner Abfrage ändern sondern wissen , das muss doch gehen oder, wie man wieder zurück zu dieser Methode springen kann!
 
Zuletzt bearbeitet:
@tfa: Der Knackpunkt dürfte sein, dass man, wenn eine der Bedingungen nicht erfüllt ist, eine Nachricht anzeigen will, die sagt, was an der Bedingung nicht stimmt (das könnte ggf. auch in den Methoden passieren, die du beschrieben hast, aber ... naja, irgendwie bin ich mir auch nicht sicher, worum es hier geht... ???:L )
 
Wer redet von geschachtelten if-Abfragen?
Dein Code produziert aber keine Ausgaben


Naja, so generell, bspw sowas:

Variante 1:
Java:
public void method(Object o)
{
       if(o==null) return;
       /// elend langer code
}

Variante 2:
Java:
public void method(Object o)
{
      if(o!=null)
      {
                 /// elend langer code
      }
}


Also ich muss sagen dass ich Variante 1 da übersichtlicher finde.
 
@tfa: Der Knackpunkt dürfte sein, dass man, wenn eine der Bedingungen nicht erfüllt ist, eine Nachricht anzeigen will, die sagt, was an der Bedingung nicht stimmt (das könnte ggf. auch in den Methoden passieren, die du beschrieben hast, aber ... naja, irgendwie bin ich mir auch nicht sicher, worum es hier geht... ???:L )

Ja, dann liefern die check-Methoden nicht true oder false, sondern einen Fehlercode oder eine Meldung, die in einer Collection gesammelt werden.
 
Es geht darum ein Registrierung zu schreiben und , dass ich auf die Methode immer und immer weder zugreifen kann ohne immer eine neue Abrate schrieben zu müssen sondern einfach wieder den Cde der Methode abrufen und verwetten kann und in diesem fall das es dann wider von vorn läuft damit er seinen Fehler beheben kann alles verständlich?
 
@iBOT: Es kann nicht sein, dass für das zweite Anzeigen des Dialogs alle Components neu erstellt werden müssen. Es gäbe viele Möglichkeiten, das, was du vorhast, umzusetzen, und du kannst sicher sein, dass man "goto" nicht braucht. Und was du genau mit "zurück zu dieser Methode springen" meinst, ist wohl niemandem so recht klar. Dass das Alter eine Zahl ist, könnte schon mit einem DocumentListener gelöst werden, und man sollte den "OK"-Button einfach so lange mit setEnabled(false) ausgrauen, bis alle Eingaben gültig sind. Von Details wie der Verwendung von JPasswordField (Java Platform SE 6) mal abgesehen.
 
Das mit den angrauen ist gut!
Könntest du mir erkären wie das funktioniert, also das man den Button erst drücken kann bis alles korreekct ist?

Und ist es möglich unter den Eingabefeldern einblende zu lassen was falsch ist?
 
Es geht darum ein Registrierung zu schreiben und , dass ich auf die Methode immer und immer weder zugreifen kann ohne immer eine neue Abrate schrieben zu müssen sondern einfach wieder den Cde der Methode abrufen und verwetten kann und in diesem fall das es dann wider von vorn läuft damit er seinen Fehler beheben kann alles verständlich?
Beispielsweise so:

Java:
boolean checkPassword()
{
 //Passwort überprüfung
 if (pw1.equals(pw2)) {
     //Ist das Alter eine Zahl?
     if(var_Alter.matches("[0-9]+")){
         if(var_Vorname.matches("[A-Z]")) {
             JOptionPane.showMessageDialog(null, "Regestrierung abgeschlossen"); 
             return true;
         }
     }else{
         JOptionPane.showMessageDialog(null, "Dein Alter muss eine Zahl sein!");
         return false;
     }
    
     
 }else{
     JOptionPane.showMessageDialog(null, "Passwörter stimmen nicht überein.Bitte versuchen Sie es erneut!");
     return false;
}

}
Die Methode kannst du dann beliebig oft aufrufen.
 
Das mit den angrauen ist gut!
Könntest du mir erkären wie das funktioniert, also das man den Button erst drücken kann bis alles korreekct ist?

Und ist es möglich unter den Eingabefeldern einblende zu lassen was falsch ist?
Du musst dir die ganzen GUI-Komponenten in eine Klasse packen und kannst die dann von meiner Methode aus entsprechend aktuallisieren.
 
Zuletzt bearbeitet von einem Moderator:
...Und ist es möglich unter den Eingabefeldern einblende zu lassen was falsch ist?

Klar einfach #sageWasFalschIst(); aufrufen und schon steht die Erläuterung hinten dran.

Ne im ernst, arbeite ein wenig mit der API und schau dir einige grundlegende Tutorials an.
Ich will das so und so und sag ma wie das geht ist für dieses Forum wohl nicht die richtige Form um in diesem Forum voran zu kommen.

Ist zumind. mein Eindruck.

Gruß Vanny
 

Zurück
Oben