# if-else in einer schleife



## barneydlx (17. Mai 2012)

ich möchte eine if else verzweigung in eine do while schleife einfügen. es soll entweder a oder b eingegeben werden , wenn keins von beiden eingegeben wurde wieder zurück an den anfang springen. sollte ich eigentlich auch selber hinkriegen aber heute will es irgendwie nicht in die richtige richtung laufen...

```
do {
			System.out.println("a oder b");
			eingabe1=sc.next();
			if (eingabe1.equalsIgnoreCase("a")){System.out.println("sie haben a gewählt");
			if (eingabe1.equalsIgnoreCase("b")){System.out.println("Sie haben b gewählt");}
			else {System.out.println("eingabe ungültig, bitte wiederholen");
			}}
		}while (true);
```


----------



## Marcinek (17. Mai 2012)

Have a break....


----------



## barneydlx (17. Mai 2012)

wörtlich genommen und nach kurzem erstaunt über die eigene dummheit gewesen...


----------



## faetzminator (18. Mai 2012)

Eigentlich kann man gleich einen boolean als Überprüfung verwenden. Ist etwas schöner als [c]while (true)[/c] und [c]break[/c]...


----------



## bERt0r (18. Mai 2012)

Der erste Gedanke von mir, wenn ich sowas sehe ist : "Setzen Sechs". Aber das soll jetzt gar nicht gegen dich gerichtet sein. Ein Lehrer der dir beibringt eine while(true) Schleife zu konstruieren sollte sich um eine Nachschulung bemühen.


----------



## Fant (18. Mai 2012)

bERt0r hat gesagt.:


> Der erste Gedanke von mir, wenn ich sowas sehe ist : "Setzen Sechs". Aber das soll jetzt gar nicht gegen dich gerichtet sein. Ein Lehrer der dir beibringt eine while(true) Schleife zu konstruieren sollte sich um eine Nachschulung bemühen.



Wieso wäre das denn so schlimm? Und: Was gäbe es denn hier für eine Alternative?


----------



## casi91 (18. Mai 2012)

Was daran so schlimm ist, ist das while(true) immer true ist.
Also haste hier eine Schleife die immer durchläuft außer du springst mit nem "break" raus.
Das ist allerdings nicht Sinn und Zweck einer Schleife.
Du könntest es Beispielsweise so machen:

```
boolean eingabe = false;
do {
            System.out.println("a oder b");
            
            eingabe1=sc.next();
            if (eingabe1.equalsIgnoreCase("a")){
                System.out.println("sie haben a gewählt");
                eingabe = true;
            }
            if (eingabe1.equalsIgnoreCase("b")){
                 System.out.println("Sie haben b gewählt");
                 eingabe = true;
            }
            else {System.out.println("eingabe ungültig, bitte wiederholen");
            }}
        }while (!eingabe);
```

Das wäre jetzt eine Lösung. Gibt bestimmt noch bessere/schönere/kürzere


----------



## ARadauer (18. Mai 2012)

zb so...


```
String eingabe = sc.next();
        while(!eingabe.equalsIgnoreCase("a") && !eingabe.equalsIgnoreCase("b")){
            System.out.println("a oder b");
            eingabe=sc.next();
        }
```



> Ein Lehrer der dir beibringt eine while(true) Schleife zu konstruieren sollte sich um eine Nachschulung bemühen.


halt ich für übertrieben... mach ich auch manchaml wenn die abbruch bedinung so komplex ist, dass sie unsauber in einen ausdruck passt ...
 mhn wobei dann sollte man sie eher in eine Methode auslagern.... mhnnn stimmt while(true) is doch nicht so schön......


----------



## ARadauer (18. Mai 2012)

```
static Scanner sc = new Scanner(System.in);
    public static void main(String[] args) {
        
        String eingabe = null;
        while(!isEingabeCorrect(eingabe)){
            eingabe=readEingabe();
        }                 
        System.out.println("fertig");
    }
    
    public static boolean isEingabeCorrect(String eingabe){
        if(eingabe == null)
            return false;
        
        if (eingabe.equalsIgnoreCase("a")){
            System.out.println("sie haben a gewählt");
            return true;
        }
        if (eingabe.equalsIgnoreCase("b")){
             System.out.println("Sie haben b gewählt");
             return true;
        }
        System.out.println("eingabe ungültig, bitte wiederholen");
        return false;
    }
    
    public static String readEingabe(){
        System.out.println("a oder b");
        return sc.next();
    }
```

while(!isEingabeCorrect(eingabe)){
            eingabe=readEingabe();
        }      
sagt halt genau aus was es macht


----------



## Marcinek (18. Mai 2012)

ja, wobei deine Schleife nie betreten wird ;D

Manachal ist der einfache weg (hier break) schon der bessere.


----------



## Fant (18. Mai 2012)

Ich stimme definitiv zu, dass man einem Code sofort ansehen sollte, was er denn macht (vielleicht nicht bis ins kleinste Detail, wenn man sich nicht etwas intensiver damit auseinander setzt, aber nungut) HIER ist das aber doch mit Sicherheit gewährleistet. Mich würde einfach nur interessieren, ob es tatsächlich einen _objektiven_ Grund gibt, das while(true)-Konstrukt pauschal so zu verteufeln?


----------



## AquaBall (18. Mai 2012)

Ich glaube auch nicht, dass 
	
	
	
	





```
break
```
 nur erfunden wurde, um schlampige Programmierer zu unterstützen.
Das selbe gilt ja für 
	
	
	
	





```
return
```
. Mehrere Returns an unterschiedlichen Stellen ist ja genau das gleiche wie mehrere Breaks.

Hier könnte Java ja auch verlangen (wie in anderen Programmiersprachen), dass es exakt nur 1 return am Ende geben darf!
Tuts aber nicht, warum sollte man dann nicht eine Schleife mit break verlassen?
Und in weiterer Folge, warum sollte es Endlosschleifen nicht zulässig oder nicht "schön" sein.

Ich finde sogar im Gegenteil: Endlosschleifen symbolisieren oft: "Das soll das Programm 'ständig' machen."


----------



## mla.rue (18. Mai 2012)

mein Dozent nannte das immer Spaghetti-Programmierung (nicht ganz so schlimm wie GoTo, aber while(true) folgt dichtauf).
Ein objektiver Grund wäre, wenn der Compiler damit nicht zurechtkäme, nur kommt der mit while(true) zurecht, somit gibt es keinen objektiven Grund, nur subjektive. Und dazu gehört halt die Lesbarkeit/Wartbarkeit, das sollte man nicht unterschätzen.

Es mag HIER noch überschaubar sein, DORT (wenn die Schleife paar Zeilen länger ist) aber nicht mehr in den ersten 3 Zeilen sein und somit sofort ins Auge fallen. Zudem, wenn mans HIER schon falsch macht, macht mans auch DORT falsch. Man sollte sich angewöhnen es auch in den einfachen Fällen schon vernünftig zu machen.


----------



## Hobbes (18. Mai 2012)

Marcinek hat gesagt.:


> ja, wobei deine Schleife nie betreten wird ;D



War auch mein erster Gedanke. Aber auf den zweiten Blick war dann auch klar, dass das funktioniert. Der Vorgabewert "null" der Eingabe gilt als ungültiger Wert, deshalb wird die Schleife betreten.

Erst wenn ein a oder ein b eingegeben wurde, wird die Schleife beendet.


----------



## AquaBall (18. Mai 2012)

Hobbes hat gesagt.:


> War auch mein erster Gedanke. Aber auf den zweiten Blick war dann auch klar, dass das funktioniert. Der Vorgabewert "null" der Eingabe gilt als ungültiger Wert, deshalb wird die Schleife betreten.
> 
> Erst wenn ein a oder ein b eingegeben wurde, wird die Schleife beendet.



ALso ganz nach dem Motto:
"Solange kein Null nie nicht umgekehrt negiert wird: Tu etwas?"

Soviel zum Thema Lesbarkeit/Wartbarkeit!

Übrigens: ganz zurück zum Anfang.
Der Fehler von TO kommt weniger aus der (Nicht-)Verwendung von break, sondern resultiert aus der unübersichtlichen Gliederung.
Man muss schon 2x hinsehen, um zu sehen, welche Klammer wohin gehört.
Mit richiger Einrückung sieht man den Fehler sofort.


----------

