Erste Schritte while Schleife die eigendlich nicht gehen dürfte

-twix-

Mitglied
Guten Morgen an euch alle,

gehe gerade zu meiner java Zertifizierung ein paar Code - Schnipseöl durch und bin dabei auf das gestoßen:

int x = 12;

while (x < 10) {
x--;
}

System.out.print(x);

Meine meinung dazu geht nicht weil 12 nicht kleiner als 10 ist, aber der Compiler weiß es mal wieder besser.... :toll: was sagt ihr dazu?
 

nrg

Top Contributor
warum soll das dann nicht gehen? es wird halt kein mal der Body ausgeführt (x--) und demnach bei syso 12 ausgegeben.
 
T

Tomate_Salat

Gast
Richtig. Aber das ist kein Grund für den Compiler zu meckern. Eben für soetwas sind Schleifenbedingungen da. Sie können ausgeführt werden, müssen aber nicht (und wenn sie ausgeführt werden, dann eben solange, bis der Wert false ist, oder man "ausbricht").
 

DerEisteeTrinker

Bekanntes Mitglied
sicher geht er nicht in die schleife, aber das sysout steht ja hinter der Schleife.
Ist so als wenn ein Kasten Wasser hinter deinem Auto steht und du überprüfst erst, ob du den Schlüssel vom Auto in der Tasche hast. Hast du nicht, aber den Kasten Wasser kannst trotzdem in deine Wohnung tragen.
 

nrg

Top Contributor
genau. ignorieren ist vllt etwas hart. er prüft die bedingung vor jedem durchlauf und nachdem diese schon beim ersten durchlauf false liefert wird die schleife beendet bevor sie überhaupt angefangen hat :)
 

xehpuk

Top Contributor
Ihr macht es euch etwas zu leicht. Hier muss man schon differenzieren. :p
Ich denke, dass es darum geht, ob der Compiler meckern würde?

Das wäre dann der Fall, wenn x final wäre. Dies würde also nicht gehen:

Java:
final int x = 12;

while (x < 10) {
	x--;
}

System.out.print(x);

Es ist also nicht so, dass der Compiler die Schleife einfach ignorieren würde. Er sieht durch das
Code:
final
, dass das x an diesem Punkt nie kleiner als 10 sein wird und daher der Block der Schleife unerreichbar ist.

Eigentlich könnte er das ja auch schon ohne final sehen. Gehe mal davon aus, dass dies aber erst durch gewisse Optimierungen bzgl. final möglich wird.
 

-twix-

Mitglied
ja im grunde genommen geht es um das kompilieren... aber interessanter ansatz mit dem final ^^

ja in dem Fall würde die Konstante ja in jedem Schleifendurchlauf verändert werden.

aber Konstanten können ja nicht verändert werden.
 
D

despikeexd

Gast
eigentlich sollte der compiler auch ohne das final erkennen können das (x--) ein unreachable statement ist da er ja weis das zwischen dem initialisieren von x mit dem wert 12 und dem prüfen ob x kleiner als 10 ist halt NICHTS mehr ist das x verändert
ich denke viel eher das der compiler nicht meckert weil er nur die while() als solches ansieht und nicht prüft ob die bedingung überhaupt jemals true werden kann denn das ist die aufgabe der Runtime und nicht des compilers

was das mit dem final angeht

xehpuk hat nur teilweise recht

der compiler weis durch das final nicht automatisch das die bedingung niemals erfüllt wird
dies bekommt er nur raus weil er mit final deklarierte referenzen anders behandelt
er stellt dann beim compilen der while() fest das x verändert werden MUSS um die bedingung zu erfüllen was aber durch FINAL nicht möglich ist
eigentlich müsste er dann nicht nur einen unreachable statement error werfen sondern auch einen illegal statement error da (x--) eine veränderung von x ist und dies laut definition von FINAL unzulässig wäre
da er diese anweisung aber bereits mit dem error kennzeichnet das sie sowieso nicht erreichbar ist wird dies verschluckt
 

xehpuk

Top Contributor
ja in dem Fall würde die Konstante ja in jedem Schleifendurchlauf verändert werden.

aber Konstanten können ja nicht verändert werden.
Darum ging es mir nicht, das meinte ich gar nicht. Es ging darum, dass der Compiler meckert, weil die Schleife nie betreten werden kann. Es gibt also auch ohne
Code:
x--;
Gemecker.

Gemecker der gleichen Sorte würds auch hier für das letzte Statement geben, weil die Schleife nie verlassen wird:
Java:
final int x = 12;

while (x > 10) {
	// x--;
}

System.out.print(x);
 

RySa

Bekanntes Mitglied
eigentlich sollte der compiler auch ohne das final erkennen können das (x--) ein unreachable statement ist da er ja weis das zwischen dem initialisieren von x mit dem wert 12 und dem prüfen ob x kleiner als 10 ist halt NICHTS mehr ist das x verändert

Und was wenn da noch weitere Threads laufen, die unter Umständen das x "zufälligerweise" vor dem Betreten der Schleife verändern würden ? Oder dass das x über Sockets oder ähnliches verändert wird ? Das kann und darf der Compiler NICHT ausschließen. Bei final ist das was anderes, da er da zu 100% sicher ist, dass das x nicht mehr verändert werden kann.

Gruß
 

RySa

Bekanntes Mitglied
Das ist eine Lokalvariable, die nur ein Thread kennt. Wie sollen mehrere Threads auf sie zugreifen?

Das stimmt. Aber nach eurer Denkensweise, müsste der Compiler genauso bei so etwas meckern (pseudocode):
Java:
public class Test{
int x = 12;

public Test(){
}

//irgend ne Methode, in der allerdigs das x nicht verändert wird.
{
.....
while(x < 10){
//inhalt
}
}
}

Da wird das x doch auch nirgendswo verändert, also müsste die while() auch als unreachable code markiert werden, oder ? Also nach eurer Denkensweise. Soll der Compiler noch extra überprüfen, ob die Variable irgendwo übergeben wurde, oder ob andere Threads ggf. eine Referenz auf das Objekt haben und die Variable verändern oder wie ?
 

xehpuk

Top Contributor
Ein Check bei (non-final) Instanzvariablen ist wohl zu weitgehend für den Compiler, weil er eben sicherstellen müsste, dass der Wert der Variable nirgendwo verändert werden kann.
Variablenübergabe ist hier ja kein Thema wegen "call by value".
 
T

Tomate_Salat

Gast
Naja, hier hast du eigentl. einen komplett anderen Fall. Da reicht schon dieses Beispiel:
Java:
public class Sample {
    private int x=12;

    public static void main(String... args) {
          while(x<10) doSomething();
    }
}

Abgesehen von Reflection, (in diesm fall nicht vorhandenen) Setter oder internen Methoden, kann das x noch von JNI-Calls manipuliert werden (mittels JNI und Reflection ist es auch möglich finale Variablen zu ändern).

Auf die schnelle würde mir hier nur bytecodemanipulation einfallen, um dieses x zu verändern, sodass es der Compiler nicht mitbekommt.
 

RySa

Bekanntes Mitglied
Variablenübergabe ist hier ja kein Thema wegen "call by value".

In diesem fall ist das kein Thema, das ist schon klar, aber wir können doch nicht erwarten, dass der Compiler guckt, ob es sich bei den Variablen um Call By Value oder Call By Reference handelt, dann noch überprüft ob es getter, setter, referenzen auf das Objekt gibt und sonst etwas.

Zu den Reflections und JNI-Calls kann ich jetzt nichts sagen, da ich auf diesem Gebiet ehrlich gesagt gar keine Ahnung habe.

Worauf ich eigentlich hinaus wollte: Meiner Meinung nach, sollte der Compiler bei solchen Fällen gar nicht meckern (auch bei final nicht - sehe Post von Tomate_Salat ). Als Unreachable code markiert gehört für mich nur Code der hinter einem Return (ohne finally und so etwas) noch eusgeführt werden sollte. Was Variablen und betreten der Schleifen aufgrund von Werten angeht, sollte der sich davon fern halten :)
 
T

Tomate_Salat

Gast
Java kennt an sich kein wirkliches Call by Value oder Call by Reference. Es wird normal lediglich die Speicheradresse des Objektes übergeben. Weswegen soetwas auch keine Nachhaltigen Auswirkungen hat:
Java:
public void doSomething(MyObject obj) 
{
    obj=new MyObject("peter");
}

aber das ist ein anderes Thema (kleiner Tipp: um solche Logikfehler zu vermeiden: Parameter einfach final machen und in der IDE die Warnung einstellen).

Das der Compiler bei final meckert ist OK und richtig so. Finale Variablen sollen nicht geändert werden, deswegen ist es richtig, dass der Compiler von einem Konstantem Wert ausgeh (das es Möglichkeiten gibt, habe ich geschrieben, diese lassen sich aber afaik durch einen SecurityManager unterbinden)t. Wenn man also streng nach dem Sinn programmiert, ist der Code tatsächlich deadcode.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M While-Schleife mit Wartezeit Java Basics - Anfänger-Themen 15
Ranger229 Endless loop in while Schleife Java Basics - Anfänger-Themen 3
M Datentypen While-Schleife eine Java Methode erstellen Java Basics - Anfänger-Themen 3
Ostkreuz While Schleife neustarten Java Basics - Anfänger-Themen 20
S Erste Schritte do-while Schleife Münzwurf Java Basics - Anfänger-Themen 1
S while Schleife Taschenrechner Java Basics - Anfänger-Themen 1
P Best Practice While loop schleife Java Basics - Anfänger-Themen 5
A Erste Schritte Aufgabe mit while Schleife Java Basics - Anfänger-Themen 11
R do while Schleife Verständnisfrage Java Basics - Anfänger-Themen 2
Say Fehlenden Code finden in einer while-Schleife? Java Basics - Anfänger-Themen 11
A Return in While Schleife Java Basics - Anfänger-Themen 6
M Erste Schritte While Schleife / Ausgabe von buchstabe & ASCII Wert Java Basics - Anfänger-Themen 4
J do..while Schleife Java Basics - Anfänger-Themen 14
B Zuweisungen und Methodenaufrufe in Bedingung der while Schleife? Java Basics - Anfänger-Themen 2
JavaBeginner22 Würfeln bis 6 while Schleife Java Basics - Anfänger-Themen 13
L while Schleife mit 2 Bedingung endet nicht Java Basics - Anfänger-Themen 3
D Array mit while-schleife Java Basics - Anfänger-Themen 12
B do while Schleife Java Basics - Anfänger-Themen 3
SergioCK Do while Schleife wiederholen Java Basics - Anfänger-Themen 14
Informatikf Methoden While Schleife Java Basics - Anfänger-Themen 3
M While Schleife? Java Basics - Anfänger-Themen 4
Poppigescorn Quersumme Berechnen mit einer While Schleife Java Basics - Anfänger-Themen 13
M Wie kann ich Werte die in einer While Schleife sind weiter genutzt werden? Java Basics - Anfänger-Themen 7
H Kann eine while-Schleife ein Programm blockieren? Java Basics - Anfänger-Themen 8
O Methode in while-Schleife aufrufen geht nur beim ersten Mal Java Basics - Anfänger-Themen 2
A Wie schaffe ich das eine while Schleife addiert danach subtrahirt? Java Basics - Anfänger-Themen 1
J for /while Schleife Java Basics - Anfänger-Themen 5
A While Schleife - buubelsort methode Java Basics - Anfänger-Themen 2
J Wie kann ich hier eine While schleife einbauen? Java Basics - Anfänger-Themen 3
S While-Schleife geht in Endlosschleife über, warum? Java Basics - Anfänger-Themen 6
S Do-While-Schleife Java Basics - Anfänger-Themen 2
S While Schleife Java Basics - Anfänger-Themen 4
S Do-While Schleife Java Basics - Anfänger-Themen 6
L String in Do-While-Schleife Abbruchkriterium Java Basics - Anfänger-Themen 1
CptK Methoden While-Schleife so lange ausführen, wie Methode etwas zurückgibt Java Basics - Anfänger-Themen 2
B Verschachtelung von For-Schleife in While Schleife Java Basics - Anfänger-Themen 14
G while schleife Java Basics - Anfänger-Themen 11
G while schleife mit array Java Basics - Anfänger-Themen 12
L Scanner schließen in While-Schleife? Java Basics - Anfänger-Themen 2
G While schleife Java Basics - Anfänger-Themen 2
mor16Euro Erste Schritte Wie nennt man eine While oder For schleife die nie Ausgeführt wird Java Basics - Anfänger-Themen 5
C Verständnisfrage bezüglich der Do-While Schleife Java Basics - Anfänger-Themen 9
B OOP While Schleife läuft Endlos durch externen aufruf Java Basics - Anfänger-Themen 2
N while Schleife wird nicht beendet, obwohl Sie hätte breaken sollen Java Basics - Anfänger-Themen 4
B mehrere Werte mit scanner und while schleife einlesen, max berechnen bzw addieren Java Basics - Anfänger-Themen 2
D While Schleife bei Bedarf durch Eingabe stoppen Java Basics - Anfänger-Themen 15
A Erste Schritte while-Schleife Java Basics - Anfänger-Themen 38
X While Do schleife funtioniert nicht Java Basics - Anfänger-Themen 5
J 2 "while"-Anweisungen in einer do-Schleife? Java Basics - Anfänger-Themen 4
W while Schleife und Bedingung Java Basics - Anfänger-Themen 11
T While Schleife funktioniert nicht Java Basics - Anfänger-Themen 14
J Input/Output Strings aneinander reihen mit while schleife Java Basics - Anfänger-Themen 25
S Try-Catch in Verwendung einer while Schleife Java Basics - Anfänger-Themen 2
P a cannot be resolved bei einer do while Schleife Java Basics - Anfänger-Themen 1
J While Schleife Java Basics - Anfänger-Themen 19
Z Return in While-Schleife Java Basics - Anfänger-Themen 7
N Methode mit While-Schleife und If-Bedingung und Array-Initialisierung Java Basics - Anfänger-Themen 4
V Erste Schritte Habe Fragen zu der For und While Schleife als auch Inkrement und Dekrement Java Basics - Anfänger-Themen 4
helldunkel While Schleife trotz false Java Basics - Anfänger-Themen 4
E Threads Thread in While-Schleife nur einmal starten Java Basics - Anfänger-Themen 2
R While-Schleife macht nicht was sie soll Java Basics - Anfänger-Themen 24
b1ck while-Schleife Java Basics - Anfänger-Themen 10
b1ck Integer initialisieren bei do-while-Schleife Java Basics - Anfänger-Themen 11
kilopack15 DoWhile-Schleife als While-Schleife darstellen Java Basics - Anfänger-Themen 9
A While-Schleife funktioniert nicht! Java Basics - Anfänger-Themen 33
A Verständnisproblem Ausgabe Do-While-Schleife Java Basics - Anfänger-Themen 3
E Alphabet mit einer while Schleife ausgeben Java Basics - Anfänger-Themen 3
T while schleife starten , beeneden und wieder Starten Java Basics - Anfänger-Themen 8
W Verständnis Probleme bei der while-Schleife und continue Java Basics - Anfänger-Themen 21
B Passwort prüfen bis eindeutig - while Schleife? Java Basics - Anfänger-Themen 11
$ Multiplikations-Rechner mit while Schleife Java Basics - Anfänger-Themen 8
T Variablen Var aus While-Schleife abfragen -.-' Java Basics - Anfänger-Themen 9
snipesss Schlüsselworte While Schleife Java Basics - Anfänger-Themen 3
snipesss While Schleife Java Basics - Anfänger-Themen 6
A Do-While Schleife; int vergleich Java Basics - Anfänger-Themen 2
K For Schleife in While Schleife umwandeln Java Basics - Anfänger-Themen 5
Ste3et_C0st Dynamische While/For Schleife Java Basics - Anfänger-Themen 7
L do-while-Schleife läuft doppelt, try catch fehler Java Basics - Anfänger-Themen 12
A While und For Schleife Java Basics - Anfänger-Themen 2
C Erste Schritte Frage zur do while- und while-Schleife Java Basics - Anfänger-Themen 4
C Do-While Schleife (Fehler bei der Klammerung?) Java Basics - Anfänger-Themen 8
C while-Schleife wird zuoft durchgeführt Java Basics - Anfänger-Themen 2
F Problem do while Schleife und Scanner Java Basics - Anfänger-Themen 2
F Programm bricht While Schleife nicht ab Java Basics - Anfänger-Themen 4
S Verständnis - Frage mehrere SQL Statements in While Schleife Java Basics - Anfänger-Themen 0
C Erste Schritte Warum ist die While Schleife so schnell? Java Basics - Anfänger-Themen 5
A was wird in der while schleife gemacht Java Basics - Anfänger-Themen 3
A Kleines Abbruch-Problem mit Do-While-Schleife Java Basics - Anfänger-Themen 4
Z Logikfehler do-while Schleife Java Basics - Anfänger-Themen 4
E While-Schleife Java Basics - Anfänger-Themen 6
D Textfield im Game ,Problem: while-Schleife Java Basics - Anfänger-Themen 1
A Probleme mit While Schleife Java Basics - Anfänger-Themen 10
M Fibonacci-Folge mit while-Schleife Java Basics - Anfänger-Themen 4
B Summe aller Zahlen von 1 bis zu dieser Zahl (ohne while oder for schleife) Java Basics - Anfänger-Themen 4
LangUndBreit Erste Schritte 100% cpu auslastung (evtl unendliche while schleife?) Java Basics - Anfänger-Themen 1
T Wie vergleiche ich die Jahre aus der while Schleife die in ( public class) fuer cbx geschrieben sind Java Basics - Anfänger-Themen 5
T while Schleife Java Basics - Anfänger-Themen 22
N While Schleife Erklärung Bitte Java Basics - Anfänger-Themen 3
F Problem mit der While schleife und dem Scanner Java Basics - Anfänger-Themen 2
A do while Schleife wird 2 mal durchlaufen Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben