Wie bricht man alles ab wenn eine Bedingung nicht erfüllt ist?

Anfänger2011

Bekanntes Mitglied
Hallo,
ich bin noch ein kleiner Anfänger in Sachen Programmieren und brauche dringend Hilfe. Ich versuche ein Programm zu entwickeln, bei dem man vier Passwörter braucht, um einen bestimmten Ordner oder eine bestimmte Datei zu öffnen:
Java:
package paket2;
import javax.swing.*;

public class Save {

	public static void main(String[] args) {
	            String Passwort1 = ("1111");
	            String Eingabe1 = JOptionPane.showInputDialog
					("Gib das Passwort ein.");
		if (Eingabe1.equals(Passwort1)) 
		JOptionPane.showMessageDialog (null, "Richtig. Gib das nächste Passwort ein.");
			else JOptionPane.showMessageDialog
                                       (null, "Passwort ist falsch. Der Zugang wurde verweigert.");
			
	             String Passwort2 = ("2222");
		String Eingabe2 = JOptionPane.showInputDialog
				("Gib das Passwort ein.");
		if (Eingabe2.equals(Passwort2)) 
		JOptionPane.showMessageDialog (null, "Richtig. Gib das nächste Passwort ein.");
		else JOptionPane.showMessageDialog
                          (null, "Passwort ist falsch. Der Zugang wurde verweigert.");
		
		String Passwort3 = ("3333");
		String Eingabe3 = JOptionPane.showInputDialog
				("Gib das Passwort ein.");
		if (Eingabe3.equals(Passwort3)) 
		JOptionPane.showMessageDialog (null, "Richtig. Gib das nächste Passwort ein.");
		else JOptionPane.showMessageDialog
                          (null, "Passwort ist falsch. Der Zugang wurde verweigert.");
		
		String Passwort4 = ("4444");
		String Eingabe4 = JOptionPane.showInputDialog
				("Gib das Passwort ein.");
		if (Eingabe4.equals(Passwort4)) 
		JOptionPane.showMessageDialog (null, "Alle Passwörter wurden angenohmen.");
		else JOptionPane.showMessageDialog
                          (null, "Passwort ist falsch. Der Zugang wurde verweigert.");
				
		}}

Das Problem besteht darin, dass wenn Passwort1 z.B. falsch ist macht der Computer einfach mit der Abfrage nach Passwort2 weiter. Wie schaft man es wenn Passwort1 falsch ist, dass dann alles Abgebrochen wird???

Hoffe sehr auf schnelle Hilfe. Und schon ma im Vorraus Danke für alles! 😉
 
ich würde das so lösen

Java:
		boolean allesRichtig = true;
		if (!bedingung1) {
			allesRichtig = false;
		} else if (!bedingung2) {
			allesRichtig = false;
		} else if (!bedingung2) {
			allesRichtig = false;
		} else if (!bedingung3) {
			allesRichtig = false;
		} else if (!bedingung3) {
			allesRichtig = false;
		}
		if (allesRichtig) {
			// mach das Wichtige
		} else {
			System.out.println("Sorry, eines ihrer Passwörter war falsch");
		}
 
Hallo Anfänger2011,

herzlich willkommen bei "java-form.org".

Wir könnten Dein Problem auch mit einer "for"-Schlaufe lösen. In dem Fall würde sich ein "break" anbieten. Etwa so:
Java:
String[] passwordList = {"1111", "2222", "3333", "4444"};
String message = "Gib das Passwort ein.";
boolean ok = true;
for (String password : passwordList) {
    String input = JOptionPane.showInputDialog(message);
    if (input == null || !input.equals(password)) {
        ok = false;
        break;
    }
    message = "Richtig. Gib das nächste Passwort ein.";
}
if (ok) {
    JOptionPane.showMessageDialog(null, "Alle Passwörter wurden angenohmen.");
}else{
    JOptionPane.showMessageDialog(null, "Passwort ist falsch. Der Zugang wurde verweigert.");
}
Gruß,
André
 
Zuletzt bearbeitet:
ich würde das so lösen

Java:
		boolean allesRichtig = true;
		if (!bedingung1) {
			allesRichtig = false;
		} else if (!bedingung2) {
			allesRichtig = false;
		} else if (!bedingung2) {
			allesRichtig = false;
		} else if (!bedingung3) {
			allesRichtig = false;
		} else if (!bedingung3) {
			allesRichtig = false;
		}
		if (allesRichtig) {
			// mach das Wichtige
		} else {
			System.out.println("Sorry, eines ihrer Passwörter war falsch");
		}

Eine IDE (oder spätestens FindBugs) sollte dir das als Warning anzeigen - 4 deiner If-Abfragen führen den selben Code aus :autsch:
Und die boolean-Variable erübrigt sich auch:
Java:
        if (bedingung1 && bedingung2 && bedingung3 && bedingung4) {
        // alles super
        } 
        else {
            System.out.println("Sorry, eines ihrer Passwörter war falsch");
        }
 
Ich würd das ganze in eine eigene Methode auslagern*, die per boolean liefert ob alles okay war oder nicht. So kannst du nämlich jederzeit mit einem
Code:
return false;
abbrechen, und es geht in der main weiter, wo du dann den entsprechenden Dialog anzeigst.

Java:
public static void main(String[] args){
 
     boolean ok = checkPasswords("1111", "2222", "3333", "4444");
     if(ok){
            JOptionPane.showMessageDialog (null, "Alle Passwörter wurden angenohmen.");
     }
     else{
            JOptionPane.showMessageDialog (null, "Passwort ist falsch. Der Zugang wurde verweigert.");
     }
}

public static boolean checkPasswords(Strings... passwords){
     for(int i = 0; i<passwords.length; i++){
            String answer = JOptionPane.showInputDialog((i+1)+"-tes Passwort eingeben:");
            if( answer == null || !answer.equals(passwords[i]) ){
                 return false;
            }
     return true;
}

* Das ist übrigens eine gängige Design-Entscheidung: Wenn du merkst, dass du im Code irgendwie immer wieder die selben Dinge tust, in deinem Fall stark ähnliche Dialoge anzeigen, dann pack das Grundgerüst in eine eigene Methode, sodass du an den jeweiligen Stellen jeweils nur noch die Methode aufrufen musst. Das macht den Code schlanker, und flexibler für Änderungen oder Erweiterungen.

PS: Es heißt "angenommen" und nicht "angenohmen" 😉

edit: Ich seh grad dass ist ja quasi das was André auch vorgeschlagen hat, sorry 😳
 
Zuletzt bearbeitet:
falls man aus Sicherheitsgründen nicht verraten will welches oder wieviele Passwörter falsch sind, sollte man schon alle eingeben lassen, da stört der Abbruch eher 😉
aber das ja war im Ursprungsposting auch nicht wirklich verschleiert
 
Schon, aber das war nicht die Frage. Er will wissen wie man eine komplexere Anweisungsgruppe an einer beliebigen Stelle einfach komplett abbrechen kann. Und das geht nun mal mit einem break oder return.
 
Na ja, meine Aussage "ich würde das so lösen" stimmt nur beschränkt ;-) es gingmir nur darum den Gedanken von if - else if - else aufzugreifen.

Ich würde erst mal alle 4 Passwörter anfordern (Wie gezeigt in einem for-loop) und dann auswerten. Ein potentieller Hacker braucht ja nicht zu wissen welches falsch war, denn sonst reduzieren wir den Hackaufwwand auf ein MasterMind Problem.
(So ähnlich wie wenn bei einem einzelnen Passwort die Meldung kommen würde: "Die dritte Stelle des eingegebenen Passwortes ist falsch" 🙂 )

So ähnliche Konstrukte mit einer boolean Variable und if-Konstrukten bzw. Switch-Case-Statements setzen wir an diversen Orten ein, aber da wird natürlich nicht nur "false" gesetzt sondern noch einiges mehr gemacht.
 
Finde den Code von hdi am besten, würde selber minimale Änderungen vornehmen, die aber so in diesem vereinfachten (static) Beispiel keinen Sinn machen, ausser natürlich die lokale Variable "ok" einzusparen, das kann man immer machen.
 
Finde den Code von hdi am besten, würde selber minimale Änderungen vornehmen, die aber so in diesem vereinfachten (static) Beispiel keinen Sinn machen, ausser natürlich die lokale Variable "ok" einzusparen, das kann man immer machen.

ACK - allerdings sollte das "return" aus der Schlaufe raus - der verrät einem potentiellen Hacker welches der Passworte falsch ist.
 
Meinte damit allerdings überhaupt nix was mit Hackern bzw. Sicherheit zu tun hat 😉
Meine Anmerkung ging eher in eine allgemeine Richtung, Methoden anstatt temp Variablen können den Code signifikant verkürzen, und ein paar andere Sachen eben die in diesem Beispiel wenig Sinn ergeben weil alles static ist.
 
Die Idee von einer neuen Methode hatte ich mir auch überlegt, bin aber zu dem Schluss gekommen, dass beim vorliegenden Fragment eigentlich für so was kein Grund besteht.

Gruß,
André
 
^ Eben André, solche Minibesipiele eignen sich oft nicht als Demo, vor allem das static macht einem da einen Strich durch die Rechnung.

Hatte deinen Code ehrlich gesagt üebrsehen, ist fast identisch mit hdis

Aus
Java:
if( answer == null || !answer.equals(passwords[i]) ){
hätte ich zuerst sowas
Java:
if( !passwords[i].equals(answer) ){
gemacht, danach sowas
Java:
if( !checkPassword(answer)){
und passwords[] zu einer Instanzvariable gemacht schlecht mit static, und dafür eine Klassenvariable zu machen ist unschön.

Auch hdis checkPasswords Methode hätte ich noch weiter runtergebrochen.
Zum Schluss hätte man das in mehrere Objekte aufgespalten -> View von der logik trennen

Macht alles nciht viel Sinn bei 20 Zeilen code in static Blöcken...
 
Hallo Anfänger2011,

ich bin auch ein Anfänger und habe das Problem so gelöst:

Java:
package paket2;
import javax.swing.JOptionPane;

public class SaveAbbrechen {

	private final static String PASSWORT1 = "1111";
	private final static String PASSWORT2 = "2222";
	private final static String PASSWORT3 = "3333";
	private final static String PASSWORT4 = "4444";
	static String InputPassword1 = null;
	static String InputPassword2 = null;
	static String InputPassword3 = null;
	static String InputPassword4 = null;
	
	public static void main(String[] args){
		InputPassword1 = JOptionPane.showInputDialog("Gib das Passwort 1 ein:");
		if (PASSWORT1.equals(InputPassword1)){
	        JOptionPane.showMessageDialog (null, "Richtig. Gib das nächste Passwort ein.");
	        InputPassword2 = JOptionPane.showInputDialog("Gib das Passwort 2 ein:");
	        if (PASSWORT2.equals(InputPassword2)){
		        JOptionPane.showMessageDialog (null, "Richtig. Gib das nächste Passwort ein.");
		        InputPassword3 = JOptionPane.showInputDialog("Gib das Passwort 3 ein:");
		        if (PASSWORT3.equals(InputPassword3)){
			        JOptionPane.showMessageDialog (null, "Richtig. Gib das nächste Passwort ein.");
			        InputPassword4 = JOptionPane.showInputDialog("Gib das Passwort 4 ein:");
			        if (PASSWORT4.equals(InputPassword4)){
				        JOptionPane.showMessageDialog (null, "Richtig. Gib das nächste Passwort ein.");
				        System.exit(0);
			        } else{
				        JOptionPane.showMessageDialog (null, "Das Passwort ist leider falsch.");
			        }
		        }else {
			        JOptionPane.showMessageDialog (null, "Das Passwort ist leider falsch.");
		        }
	        } else {
		        JOptionPane.showMessageDialog (null, "Das Passwort ist leider falsch.");
	        }
		} else {
	        JOptionPane.showMessageDialog (null, "Das Passwort ist leider falsch.");
		}
	}
}
 
Hallo,
vielen DANK! für eure zahlreichen Ideen und Vorschläge um mein Problem zu lösen oder mein Programm noch ein wenig zu verbessern. Gestern bin ich jedoch auf eine viel simplere Idee gekommen:
Java:
package paket2;
import javax.swing.*;
 
public class Save {
 
    public static void main(String[] args) {
                String Passwort1 = ("1111");
                String Eingabe1 = JOptionPane.showInputDialog
                    ("Gib das Passwort ein.");
        if (Eingabe1.equals(Passwort1)) 
        JOptionPane.showMessageDialog (null, "Richtig. Gib das nächste Passwort ein.");
            else {JOptionPane.showMessageDialog
                                       (null, "Passwort ist falsch. Der Zugang wurde verweigert.");
                    System.exit(-x);}
            
                 String Passwort2 = ("2222");
        String Eingabe2 = JOptionPane.showInputDialog
                ("Gib das Passwort ein.");
        if (Eingabe2.equals(Passwort2)) 
        JOptionPane.showMessageDialog (null, "Richtig. Gib das nächste Passwort ein.");
        else {JOptionPane.showMessageDialog
                          (null, "Passwort ist falsch. Der Zugang wurde verweigert.");
                System.exit(-x);}
        
        String Passwort3 = ("3333");
        String Eingabe3 = JOptionPane.showInputDialog
                ("Gib das Passwort ein.");
        if (Eingabe3.equals(Passwort3)) 
        JOptionPane.showMessageDialog (null, "Richtig. Gib das nächste Passwort ein.");
        else {JOptionPane.showMessageDialog
                          (null, "Passwort ist falsch. Der Zugang wurde verweigert.");
                Sytem.exit(-x);}
        
        String Passwort4 = ("4444");
        String Eingabe4 = JOptionPane.showInputDialog
                ("Gib das Passwort ein.");
        if (Eingabe4.equals(Passwort4)) 
        JOptionPane.showMessageDialog (null, "Alle Passwörter wurden angenohmen.");
        else {JOptionPane.showMessageDialog
                          (null, "Passwort ist falsch. Der Zugang wurde verweigert.");
                System.exit(-x);}
                
        }}

Viele Grüße und noch mal DANKE
Anfänger2011
 
Hm, findest du das wirklich simpler als unsere Vorschläge? Ist doch fast genauso viel redundanter Code, den du da hast. Ich wiederhole mich: Wenn du gleichen oder stark ähnlichen Code mehrfach schreibst, dann ist das schlecht.

Stell dir vor statt ner 4-stufigen Abfrage solls jetzt ne 10-stufige werden
Denk nochmal drüber nach... Generll hab ich das Gefühl du hast bei jedem Beitrag auf "Danke" geklickt ohne ihn zu lesen...

Ich wiederhole mich wieder: Die Anzeige der einzelnen Passwortaufforderungen solltest du in eine eigene Methode auslagern, da das einfach redunandter Code ist...
 
Hallo,
ich meinte mit simpler eigentlich nur das ich nur
Java:
System.exit(-x)
hinzufügen musste und nicht das ganze Programm verändern. Dennoch habe ich mir aus sämtlichen Beitragen die besten Ideen und Vorschläge herrausgeschrieben und in ein Word Dokument eingfügt, falls ich diese in einem anderen Programm später vielleicht noch einmal brauchen sollte.

Den Einwurf, dass ich eure Beiträge nicht gelesen haben soll, weise ich zurück. Ich wusste lediglich nur nicht wie oft oder ob man den DANKE Button klicken sollte/musste, damit ihr das DANKE erhaltet. (Wenn mir jdm. kurz einmal erklären könnte wie genau das gesamte Prinzip diese Buttons funktioniert wäre ich sehr dankbar.)

Viele Grüße
Anfänger2011
 
Ok sorry, das hat sich so angehört als würdest du diese Lösung jetzt als die beste ansehen 😉

Wg. dem Danke: Du musst dich nicht für jeden Beitrag bedanken. 1x Danke reicht, und es ist dir auch keiner böse wenn du dich nicht bedankst, vorallem bei so einem beitrag wo sehr viele leute schreiben musst du dir nicht den Umstand machen dich jedem einzelnen zu bedanken. Wenn du "Danke" schreibst dann geht das an alle raus.. dieses Danke-Feature ist nicht so wichtig 😉
 

Zurück
Oben