Fehler bei IF abfrage

Diskutiere Fehler bei IF abfrage im Allgemeine Java-Themen Bereich.
T

TimMatten

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^^
 
H

httpdigest

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.
 
T

TimMatten

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 ;)
 
H

httpdigest

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));
}
 
X

Xyz1

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..
 
mihe7

mihe7

Bzgl. "Intention" klar machen bevorzuge ich für die Benennung solcher Methoden "find" und nicht "get". Bei get würde ich eine Exception werfen, bei find ein Optional (bzw. hier OptionalInt) liefern.
 
Thema: 

Fehler bei IF abfrage

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben