# while(true){}



## henpara (16. Dez 2010)

Hallo,
mir ist öfter schon aufgefallen, daß leute im Programm

```
while(true){
//anweisung(en)
}
```
benutzen.

Ist das guter Stil, hat man Alternativen?
Ich wäre bisher nie im Leben auf so eine Art von Anweisung zu kommen, ist ja auch eig. wie ne Endlosschleife oder nicht?
Würd mich über n bischen Aufklärung freuen.

mfg

Edit: Unsinn gelöscht, Fragestellung korrigiert *schäm und thx @Civilazi


----------



## Civilazi (16. Dez 2010)

Du denkst da komplett falsch. In der while-_Schleife_ wird der Code im Block dauernd wiederholt.


----------



## mariusbopp (16. Dez 2010)

naja da steht ja quasie "solange es zutrifft mache"
und wenn dieser zustand sich nicht in der schleife ändert ist es eine endlosschleife!
aber im regelfall hat man eine änderung


----------



## bone2 (16. Dez 2010)

naja es gibt einfach services oder server programme die ewig laufen sollen. eine programm das eine queue regelmäßig abarbeiten soll zb.

anbieten würde sich aber trotzdem dann irgendwas einzubaun, damit man es stoppen kann ohne den server herunterzufahren. zb ein lockfile, das man vorher erstellt, nachher löscht und bei jedem durchlauf einmal auf existenz prüft. löscht man die datei manuell stopp die schleife


----------



## Marco13 (16. Dez 2010)

Das macht in machen Fällen Sinn, z.B. bei einem Daemon-Thread der ewig im Hintergrund laufen soll, oder wenn die Abbruchbedingung für die Schleife ... nicht "schön" in den Schleifenkopf passt. Z.B. bei sowas wie

```
String line = null;
while (true)
{
    line = bufferedReader.readLine();
    if (line == null) 
    {
        break;
    }
    machWasMit(line);
}
```

Das KANN man zwar auch in eine Zeile schreiben
[c]while ((line=bufferedReader.readLine()) != null) { ... }[/c]
aber ich finde ersteres übersichtlicher...


----------



## mariusbopp (16. Dez 2010)

ja natürlich gibt es ausnahmen bei denen dinge dauerhaft laufen sollen aber selbst die sollten eine abbruchbedingung haben...


----------



## Marco13 (16. Dez 2010)

Das Beispiel hat ja eine, aber bei einem Daemon-Thread ist eine Abbruchbedingung ... prinzipbedingt (!?) nicht notwendig.


----------



## nrg (16. Dez 2010)

mariusbopp hat gesagt.:


> ja natürlich gibt es ausnahmen bei denen dinge dauerhaft laufen sollen aber selbst die sollten eine abbruchbedingung haben...



häää? ???:L


----------



## mariusbopp (16. Dez 2010)

Marco13 hat gesagt.:


> Das macht in machen Fällen Sinn, z.B. bei einem Daemon-Thread der ewig im Hintergrund laufen soll


warum häää??

edit: ^^ okay ich glaub ich weiß wieso häääh... also ich hatte das so gemeint das manche dinge dauerhaft laufen müssen sollen wie aich immer aber trotzdem noch eine ""hintertür" zum ausstieg haben sollte (abruchbedingung) hääh geklärt oder immernoch häh


----------



## nrg (16. Dez 2010)

naja für mich war das irgendwie ein Widerspruch in sich  (edit: nicht das von Marco)


----------



## mariusbopp (16. Dez 2010)

klar hört sich auch so an war vielleicht etwas unklug vormuliert von mir^^

aber hab nochmal n edit eins drüber gemacht!:toll:


----------



## Andi_CH (16. Dez 2010)

mariusbopp hat gesagt.:


> ja natürlich gibt es ausnahmen bei denen dinge dauerhaft laufen sollen aber selbst die sollten eine abbruchbedingung haben...



Jede embedded software wird mit while(true) laufen - die einzige Abbruchbedingung ist "power off" und das muss man sicher nicht codieren


----------



## mariusbopp (16. Dez 2010)

ueh:


----------



## frostbyte (17. Dez 2010)

Andi_CH hat gesagt.:


> Jede embedded software wird mit while(true) laufen - die einzige Abbruchbedingung ist "power off" und das muss man sicher nicht codieren



Naja, wenn sie keinen Ausstiegspunkt hat, dann wird sie vielleicht mitten in einer Transaktion den TERM Befehl ignorieren und dann plötzlich kurz vor dem Speichern durch den KILL zum beenden gezwungen werden. Dann doch lieber erst nach der Transaktion beenden.


----------



## Landei (17. Dez 2010)

Wenn es wirklich "ewig" läuft wie z.B. bei einem Server, finde ich das OK, aber die Variante mit break oder return mittendrin würde ich möglichst vermeiden, insbesondere wenn die Schleife etwas länger ist.


----------



## Nicer (17. Dez 2010)

ein Break ist ja sozusagen ein Harter ausstieg aus der schleife , wird break aufgerufen wird die schleife nicht zuende gerechnet und dann schön beendet sondern an dieser stelle bricht sie einfach ab. leider leider gibts in java ja kein goto :&


----------



## frostbyte (17. Dez 2010)

naja, ob du in die Schleife C, break, A, B reinschreibst oder in eine normale Schleife mit Abbruchbedingung einfach A, B, C ist doch egal.

Und goto ist wohl bei gutem Programmierstil komplett überflüssig, bei OO und mehreren Threads würde das wahrscheinlich auch schwer werden den Durchblick zu behalten.


----------



## Empire Phoenix (18. Dez 2010)

also genau genommen ist break doch ein goto.. wenn man sich das ganze mal auf bytecode anguckt.

Und es gibt einige Sachen wo sich das schon anbietet, bei einer langen schleife mit 5 verschiedeen abbruchbedingungen die voneinander abhängig will ich den code mal sehen

while true{
B = blaA
if b == null break
C= blaB
if C==null break
blaC
}

oder 


while notdone{
B = blaA
if b == null notdone = false
if b != null {
c = blaB
if c == null notdone = false
if(c =! null{
blaC
}
}

bei sowas darf man sich schon streiten was besser lesbar ist


----------



## Noctarius (18. Dez 2010)

In Bytecode ist vieles ein Goto (z.B. jeder Jump, jedes Try/Catch usw), trotzdem sollte man das in Java Sourcecode möglichst außen vorlassen


----------



## frostbyte (18. Dez 2010)

In Assembler gibt es gar keine Schleifen, nur jumps


----------



## Nicer (18. Dez 2010)

Noctarius hat gesagt.:


> In Bytecode ist vieles ein Goto (z.B. jeder Jump, jedes Try/Catch usw), trotzdem sollte man das in Java Sourcecode möglichst außen vorlassen



Jop , denn sonst meckert der Compiler


----------



## Noctarius (18. Dez 2010)

frostbyte hat gesagt.:


> In Assembler gibt es gar keine Schleifen, nur jumps



Genau genommen ist es ein Conditional Jump *duck*


----------



## Nicer (19. Dez 2010)

xD , ihr kommt wieder vom Hundertste ins Tausendste


----------



## Zerker (19. Dez 2010)

```
break <marke>
```
 is in vielen des gleiche wie 
	
	
	
	





```
goto
```
.

an TO: 

```
while(true)
{
    ; //Anweisungen
}
```

true -> die bedingung jeder schleife in java ist ein ausdruck. ausdrücke geben einen wahrheitswert zurück (boolean). daher ist es praktisch hier true zu nehmen, damit das programm unendlich lange läuft. (in java)

man könnte auch:



```
int i = 1;

while(i == 1) // liefert true zurück -> boolsch
{

}
```

falls der wert vom ausdruck true is, wird der rumpf ausgeführt.
falls der wert false is, dann eben nicht.

in c(++) kriegt man eben kein boolschen wert, sondern eine 1 oder 0.

das würd in c(++) gehn:


```
while(1) //liefert 1 zurück -> int
{
    ; //Anweisung
}
```


das hab ich heute zufällig in der Insel gelesen, die ich gestern gekauft hab^^


Greetings,
Zerker.

edit: hoppala, da hab ich mir grad selber widersprochen^^


----------



## XHelp (19. Dez 2010)

Zerker hat gesagt.:


> man könnte auch:
> 
> 
> ```
> ...



In C - ja, in Java - nein.


----------



## frostbyte (19. Dez 2010)

@Zerker: Das ist absolut korrekt (bis auf das, was XHelp angemerkt hat). Du könntest auch [c]while (($i = 1) == 1)[/c] eine beliebige Funktion dort einsetzen.

Das Problem mit [c]while (1)[/c] ist, dass 
	
	
	
	





```
1
```
 ein int ist, während dort ein boolean erwartet wird. In C und PHP ist das kein Akt, da ein int auf einen boolean gewandelt wird. Letztlich ist dort die 
	
	
	
	





```
1
```
 ein [c]while (1 != 0)[/c]. So könntest du das dann auch in Java machen


----------



## Zerker (19. Dez 2010)

danke^^
hab mich vertan. würde ja dem was ich gesagt hab total widersprechen.

Greetings,
Zerker


----------

