Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Wie bricht man alles ab wenn eine Bedingung nicht erfüllt ist?
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!
Entweder du verschachtelst alle weiteren Abfragen in den Block, in dem das "ok" ausgegeben wird. Oder du speicherst in einem boolean, ob bis anhin alles korrekt war.
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
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.
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.
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,
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);}
}}
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.)
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