Fehler bei IF abfrage

Hallo Zusammen,

Bei folgendem Problem bräuchte ich eure Hilfe, denn ich kann mir das Ganze nicht erklären...
Zuerst jedoch zum Beginn des Ganzen:
1. Ich schreibe mehrere Objekte der Klasse "FileManagerReader" in eine ArrayList.
2. Die Methode getUID() gibt dabei die uID ( = Tag ID eines RFID Batches) als Long zurück.
3. Wenn ich eine spezifische uID aus der ArrayList entfernen möchte, nutze ich folgende Methode um den Index zu finden:

Java:
int getIndexFromTagID(Long getReadId) {

    int i = 0;
    Long ruID = getReadId;

    for (i = 0; i < afmr.size(); i++) {
        
        System.out.println("-----------");
        System.out.println(afmr.get(i).getUID() + " == " + ruID);
        System.out.println("-----------");

        if (ruID == afmr.get(i).getUID()) {
        return i;
        }

    }

    return 99;
}
4. Die Ausgabe ist wie gefolgt:
Bash:
RFID | Waiting...
-----------
905959482362 == 760067375887
-----------
-----------
843850294139 == 760067375887
-----------
-----------
946157757265 == 760067375887
-----------
-----------
157341283248 == 760067375887
-----------
-----------
760067375887 == 760067375887
-----------
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 99, Size: 5
    at java.util.ArrayList.rangeCheck(ArrayList.java:653)
    at java.util.ArrayList.get(ArrayList.java:429)
    at main.FileManager.ManageUser(FileManager.java:68)
    at main.Main.main(Main.java:253)
5. Die if Methode müsste erfüllt werden (letzter Wert vor Fehler).

Nun die logische Frage, warum zum Teufel passiert dies nicht?
Ich würde mich freuen, wenn mir jemand bei diesem Problem helfen könnte und bedanke mich schon im Voraus.

Grüsse Tim

Ps. Evtl ist dies nicht die souveränste Lösung^^
 
Der `==` Operator auf Referenztypen (wie es der java.lang.Long Wert ist) vergleicht nicht nach Wert/Inhalt, sondern nach Objektidentität. Die beiden Longs, der in dem Objekt innerhalb der ArrayList und der, mit dem du vergleichst, sind zwei unterschiedliche Objekte. Du solltest hier entweder den Vergleich ändern nach `if (ruID.equals(afmr.get(i).getUID()))` oder einfach überall mit Primitiven `long` arbeiten.
 
Der `==` Operator auf Referenztypen (wie es der java.lang.Long Wert ist) vergleicht nicht nach Wert/Inhalt, sondern nach Objektidentität. Die beiden Longs, der in dem Objekt innerhalb der ArrayList und der, mit dem du vergleichst, sind zwei unterschiedliche Objekte. Du solltest hier entweder den Vergleich ändern nach `if (ruID.equals(afmr.get(i).getUID()))` oder einfach überall mit Primitiven `long` arbeiten.
Stimmt, da war ja was. Vielen Dank für diese zügige Antwort.

Wenn du mit einer Liste arbeitest, gibt es wesentlich bessere Methoden.
Ich bin in diesem Fall auf keine bessere Lösung gekommen, aber ich lasse mich gerne des Besseren belehren ;)
 
Das mit dem separaten Index holen und dann wahrscheinlich mit `List.remove(int)` entfernen, kannst du in einer Methode machen:
Java:
void removeElementsWithUID(Long uidOfElementsToRemove) {
  afmr.removeIf(e -> e.getUID().equals(uidOfElementsToRemove));
}
 
99 ist ein magischer Wert, ein Unding, gehört nicht da hin.

Valide Werte für Indizes sind -1, 0 und +1. Da letztere zwei wegfallen bleibt -1 übrig.

Der Vergleich klappt nicht weil du equals() aufrufen musst..
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben