Hallo,
mir ist öfter schon aufgefallen, daß leute im Programm
Java:
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
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
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
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
Code:
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...
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
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.
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.
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 :&
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.
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
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:
Java:
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:
Code:
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^^
@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
Code:
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
Code:
1
ein [c]while (1 != 0)[/c]. So könntest du das dann auch in Java machen