List.isEmpty() klappt nicht?!?!?

Status
Nicht offen für weitere Antworten.

Tobias

Top Contributor
High,
ich habe eine Klasse, die zwei List-Objekte beinhaltet. Um überprüfen zu können, ob diese Listen etwas enthalten, rufe ich List.isEmpty() für die beiden auf und initialisiere je nach Rückgabewert eine boolean-Variable hasElements, die von außen abgefragt werden kann.
Wenn ich die Listen jedoch mit ArrayLists initialisiere, führt isEmpty() zu falschen Ergebnissen! Der Debugger gibt als Werte folgendes aus:

Code:
ArrayList ArrayList@46d:
[1] => null
[2] => null
.
.
.

Schön, schön, nur leider sind das die Default-Werte, die er beim Anlegen der ArrayList darein geschrieben hat! Sprich ich habe tatsächlich nichts in der List gespeichert!
Auch ein Cast und anschließendes Aufrufen von ArrayList.isEmpty() bringt nicht das gewünschte Ergebnis. Somit erkläre ich isEmpty() für schwachsinnig, bis mir jemand das Gegenteil beweist.

mpG
Tobias
 
kann ich ehrlich gesagt nichts ganz glauben...

die Methode isEmpty() liefert zurück, ob die interne Variable "size" gleich 0 ist. die Variable size wird beim erstellen einer Liste immer auf 0 initialisiert (außer man initialisiert die Liste mit einer Collection). Sie wird nur bei den add methoden geändert !!

Wenn du von deinem Code überzeugt bist dann poste doch mal ein bisschen davon, würde mich interessieren....
 
hasAnyFlags und hasAnyParameters sind die boolean-Variablen, flags und parameters die entsprechenden Listen. Konstruiert wird dieses Object im Moment zweimal (wird noch ein bißchen öfter vorkommen) und zwar einmal mit new Command(blah.getClass(), "command", new ArrayList(), new ArrayList()) und einmal mit new Command(blah.getClass(), "command", null, null).

Code:
public Command(Class recipient, String command, List flags,
                     List parameters) throws NullPointerException {
            if(recipient == null) {
                  throw new NullPointerException("Recipient is not permitted to"
                                                 + " be null!");
            }
            if(command == null) {
                  throw new NullPointerException("Command is not permitted to"
                                                 + " be null!");
            }

            if((flags == null) || (flags.isEmpty())) {
                  this.hasAnyFlags = false;
            }
            if((parameters == null) || (parameters.isEmpty())) {
                  this.hasAnyParameters = false;
            }

            this.recipient = recipient;
            this.command = command;
            this.flags = flags;
            this.parameters = parameters;
      }

Gechrieben hab ich das heute nacht, durchaus möglich, das ich ja doch was übersehen habe. Ich hoffe es sogar sehr!

mpG
Tobias
 
entweder habe ich dich nicht verstanden, oder ich kann den fehler nicht reproduzieren.
Wenn ich deinen Code nehmen und folgendes mach:
Code:
Command c = new Command(String.class, "command", new ArrayList(), new ArrayList());
System.out.println(c.hasAnyFlags);
System.out.println(c.hasAnyParameters);
Command c2 = new Command(String.class, "command", null, null);
System.out.println(c2.hasAnyFlags);
System.out.println(c2.hasAnyParameters);
erhalte ich für alle ausgaben false und das soll laut code auch so sein !

???:L ???:L
 
Verdammt, ja, das soll so sein.

Nichtsdestotrotz versucht da eine Funktion auf flags zuzugreifen und produziert so IndexOutOfBoundsExceptions, wenn flags leer ist. Der dortige Code sieht auf den ersten Blick aber ok aus... Ich werde ihn mal ausführlich mit dem Debugger analysieren. Und ich ziehe meine Kritik an List.isEmpty() natürlich zurück!

mpG
Tobias
 
Jaja, meine parse()-Methode funktioniert nicht so wie erwartet. Sie macht zwar genau das, was sie soll, wenn da was ist, aber nicht, wenn da nichts ist... Verdammte Randbedingungstests!

mpG
Tobias
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben