2017-05-26 1 views
0

Aus irgendeinem Grund konnte ich eine removeAll auf einer Erweiterung von AbstractList ausführen.Die Methode hat UnsupportedOperationException nicht ausgelöst, obwohl es sollte

Insbesondere diese Liste war eine java.util.Arrays.Arraylist (die nicht java.util.ArrayList ist), die eine Erweiterung von AbstractList ist, die das Entfernen oder Hinzufügen nicht unterstützt.

nach dem Ändern der folgenden Zeilen

Set<String> defaultList = new HashSet<>(Arrays.asList(getDefaultNames())); 
    Set<String> names = new HashSet<>(_adapter.getContainerNames()); 

    defaultList.removeAll(names); 

Um

List<String> defaultList = Arrays.asList(getDefaultNames()); 
    List<String> names = _adapter.getContainerNames(); 

    defaultList.removeAll(names); 

Ich war in der Lage, den Code zu kompilieren, führen Sie es aus und die Liste in sortierter Reihenfolge sehen, die auch nach der App komplett deinstallieren.

nach der Rückkehr aus dem Essen kommt, alle Haltepunkte entfernen (I in jeder Zeile einen Haltepunkt hatte), und ein paar Mal zwischen der alten und neuen Version Schalt (Überprüfung jede Version in git heraus, Kompilieren und Installieren), Anstatt eine sortierte Liste zu haben, habe ich eine UnsupportedOperationException bekommen.

Jetzt habe ich aus der im android.jar.java.util.Arrays sichtbaren Open-Source-Code herausgelesen, dass dies nie ausgeführt hätte werden sollen.

Ich bin ernsthaft verblüfft und ich vermute, das ist eine Art Caching-Bug oder aufgrund vielleicht nicht sauber bauen, aber wie könnte so etwas auftreten?

Ist dies zu erwarten und möglicherweise reproduzierbar?

Wie kann ich das in Zukunft vermeiden? Muss ich jedes Mal sauber bauen?

Haben die Breakpoints irgendwie verhindert, dass dieser Code sauber erstellt wurde?

Antwort

1

Es gibt einige mögliche Erklärungen, und Sie haben bereits einige erwähnt. Für mich scheint es, dass die wahrscheinlichste Erklärung ist, dass in Ihrem Fall removeAll() nur eine UnsupportedOperationException wirft, wenn Sie tatsächlich versuchen, ein oder mehrere Elemente durch sie zu entfernen.

Ich habe gerade versucht dies:

Arrays.asList("Ole", "No").removeAll(Collections.singletonList("HopefullyHelpful")); 

es auf meinem Computer fein läuft, keine Anzeichen für eine Ausnahme. Ich benutze Java 8, so dass es kann nicht gut laufen auf Android, aber Sie können es versuchen. Ich habe jedoch in der Dokumentation nichts gefunden, was dies erlauben würde.

Während die Überreste aus einem früheren Build eine andere mögliche Erklärung sind, sollten Ihre Haltepunkte sicherlich nichts mit Ihren Beobachtungen zu tun haben.

Verwandte Themen