Leere Anweisung

  • Themenstarter Themenstarter hüteüberhüte
  • Beginndatum Beginndatum
H

hüteüberhüte

Gast
Java:
    public static void putMap(Map<String, Object> map, String s) { // + value parameter
        int idx = 0;
        if (s.matches("^\\d+_\\d+$")) {
            int indexOf_ = s.indexOf('_');
            idx = Integer.parseInt(s.substring(indexOf_ + 1));
            s = s.substring(0, indexOf_);
        }
        String sNew;
        while (map.containsKey(sNew = s + "_" + ++idx));
        map.put(sNew, null);
    }

IDE sagt mir Leere Anweisung in Zeile 9!
 
Zuletzt bearbeitet von einem Moderator:
Code:
while (map.containsKey(sNew = s + "_" + ++idx));
ist tot/endlos, es passiert nie etwas
 
probiers mal mit
Code:
{ }

du könntset deinen code auch durch
Code:
while(true);
ersetzen.


edit: da ist ein
Code:
;
em ende des
Code:
while
 
Zuletzt bearbeitet von einem Moderator:
Eine While-Schleife sieht normal so aus:

Java:
while(Anweisung){
    Tue etwas
}

deine sieht aber so aus:

Java:
while();

was gar nichts tut.

Hoffentlich bringt das etwas Licht ins Dunkel 😉

Grüße
 
Hallo,

die leere while-Schleife ist so gewollt.
Innerhalb des Aufrufs von containsKey steht eine Zuweisung an sNew.
Offensichtlich soll die Map Schlüssel der Form 123_45 enthalten.
Die Methode generiert einen neuen Schlüssel 123_46 und fügt ihn in die Map ein.

Gruß
 
Nein, denn da hinter dem while ein [c];[/c] steht, ist es eine potentielle Endlosschleife.

Ich zieh es mal auseinander, vllt wird es dann klarer:
Java:
while (map.containsKey(sNew = s + "_" + ++idx))
    ;
map.put(sNew,null);

um es noch weiter zu verdeutlichen:

Java:
while (map.containsKey(sNew = s + "_" + ++idx))
{
}
map.put(sNew,null);

das ist alles das gleiche ;-)

ach und noch so am Rande:
Parameter zu überschreiben ist keine sonderlich gute Idee. Wenn du mit Eclipse arbeitest würde ich dir empfehlen, unter den SaveActions einzustellen, Parameter immer final zu machen.
 
Hallo,

die leere while-Schleife ist so gewollt.
Innerhalb des Aufrufs von containsKey steht eine Zuweisung an sNew.
Offensichtlich soll die Map Schlüssel der Form 123_45 enthalten.
Die Methode generiert einen neuen Schlüssel 123_46 und fügt ihn in die Map ein.

Gruß

Danke, utnovetur!

Diese Methode funktioniert ja, aber Ide sagt mir, daß ich das so nicht machen darf und zeigt mir den Fehler!

Ganz schön fies... 🙁

Grüßle

Gesendet mit Tapatalk 2
 
Nein, denn da hinter dem while ein [c];[/c] steht, ist es eine potentielle Endlosschleife.
Och, das passt schon so. Da ist ja die Laufvariable
Code:
idx
dabei. Es wird nur eine Endlosschleife, wenn die Map 2^32 Einträge enthält, wovon ich nicht ausgehen würde.

[OT]
Wenn du mit Eclipse arbeitest würde ich dir empfehlen, unter den SaveActions einzustellen, Parameter immer final zu machen.
Kann ich nicht empfehlen. Hat mir mehrmals den ganzen Code irreversibel zerschossen.[/OT]

Diese Methode funktioniert ja, aber Ide sagt mir, daß ich das so nicht machen darf und zeigt mir den Fehler!
Du kennst schon den Unterschied zwischen Warnung und Fehler?
 
Och, das passt schon so
sobald der Wert nicht als Key enthalten ist, ist es eine Endlosschleife

[OT]
Kann ich nicht empfehlen. Hat mir mehrmals den ganzen Code irreversibel zerschossen.
Dann hast du schonmal einen Fehler gemacht und auf ein SCM verzichtet.
Ansonsten tut es (bei mir über verschieden Eclipseversionen auf mehreren Computern) genau das was es soll. Wenn du Probleme bekommst, dann weil du finale Parameter versuchst zu überschreiben.[/OT]
 
Hihihihi, ja da hast du auch wieder recht, aber ich hab eine etwas umfangreichere Klasse, mit alten Zeugs, was/womit ich abschließen wollte, was aber noch diese gelben .... Warnungen enthält. vlg

Gesendet mit Tapatalk 2
 
Ob die While-Schleife nun tot ist oder nicht, beim Ausdruck "+ ++idx" gehört "++idx" auf jeden Fall in Klammern (zumindest zeigt Eclipse 'nen Fehler, wenn man den Ausdruck in der Bedingung isoliert).
 
Zuletzt bearbeitet von einem Moderator:
Hi,

da die Zeile 9 ganz schön verschachtelt ist, wäre es sinnvoll sie etwas übersichtlicher zu schreiben:

Java:
sNew = s + "_" + idx;
while (map.containsKey(sNew)){
sNew = s + "_" + (++idx);
}

Meine Vermutung ist, dass der Suchstring falsch zusammen gesetzt wird.

Es muss evtl. auch die Integer-Variable "idx" nach String konvertiert werden:

[c] sNew = s + "_" + Integer.toString(++idx); [/c]



Gruß dlohd101
 
Zuletzt bearbeitet:
Stimmt...

Wäre demnach in der Form besser:

Java:
String sNew = s + "_" + idx;
while (map.containsKey(sNew)){
sNew = s + "_" + (idx++);
}

🙂

Gruß dlohd101
 
Zuletzt bearbeitet:
Wenn die IDE ein solches Konstrukt tatsächlich als Error - und nicht etwa als Warning - ausgeben sollte, dann würde ich meine Compilereinstellungen anpassen. Meistens ist so was tatsächlich nicht sehr schön, und mit dem Semikolon wohl ein Schreibfehler. Aber ab und an braucht man das ggf. - wär zumindest bei mir nicht das erste Mal.
 
Was heißt denn die Schleife ist tot, und wie soll der Compiler das erkennen, sollte ich irgendwelche Einstellungen verändern oder auf stur schalten? Ich danke euch, für eure hilfe, schon mal...
 
Wenn du nicht auf Warnungen stehst, implementiere es wie's dlohd101 vorgeschlagen hat. Die Schleife ist für den Compiler tot. Er sieht an dieser Stelle nur 'ne While-Schleife mit gültiger Bedingung in der nichts geschieht. Liegt daran, dass der Compiler zu dieser Zeit noch nicht weiss, dass innerhalb der Schleife keine weiteren Anweisungen mehr nötig sind, weil sie bereits zur Bedingung gehören.
 
hmm, ja mein Fehler. Hab das [c]++[/c] nicht gesehen, jetzt ergibt der Post von xehpuk natürlich viel mehr Sinn. Ich schiebs mal auf Freitag und das "kurz-vor-feierabend-macht-man-die-dümmsten-fehler"-Phänomen 😀
Jo bei mir das gleiche, habe auch das ++ übersehen.
Würde das in der tat ähnlich dlohd101's code umsetzen, allerdings ist die zweite lösung falsch, zumindest das ergebnis. das erste idx wird zweimal getestet und am ende ist idx einen wert zu hoch.
 
Jo bei mir das gleiche, habe auch das ++ übersehen.
Würde das in der tat ähnlich dlohd101's code umsetzen, allerdings ist die zweite lösung falsch, zumindest das ergebnis. das erste idx wird zweimal getestet und am ende ist idx einen wert zu hoch.
???:L Ob man's evtl. deswegen alles schlicht in die Bedingung gesetzt hat? Aber BTW.: Es ist (mal wieder) wie bei 'ner for Schleife. Der Schleifenzähler ist hinter der Schleife nicht mehr wichtig. Seine 2. Lösung arbeitet also korrekt.
 
???:L Ob man's evtl. deswegen alles schlicht in die Bedingung gesetzt hat? Aber BTW.: Es ist (mal wieder) wie bei 'ner for Schleife. Der Schleifenzähler ist hinter der Schleife nicht mehr wichtig. Seine 2. Lösung arbeitet also korrekt.

weil es schlechter lesbar ist, ist alles im schleifenkopf?
aber ja, es wird sNew und nicht idx gesucht, hab ich bei dem Codeschnipsel vergessen.
 
Zuletzt bearbeitet von einem Moderator:
OK! Jetzt ist etwas seltsames passiert, IDE zeigt mir manchmal den Fehler/Warnung und manchmal auch nicht! Ich war absolut inaktiv. Geister, es spukt! 😡
 
Ist das ein grössers Projekt? Dann ändere mal bissl Quelltext, speichere und achte unten rechts mal auf den Progress (Building workspace...). Solange dauert's bis Fehler und Warnungen in der IDE korrekt angezeigt werden. Anders lässt sich der Spuck erstmal nicht erklären.
 

Zurück
Oben