Sto cercando di rimuovere elementi da un List
e ottenere java.lang.UnsupportedOperationException
.Perché List.remove (int) lancia java.lang.UnsupportedOperationException?
public <T extends Object> void findDuplicates(
String title, Multimap<T, ChunkId> map) {
for (T key : map.keySet()) {
Collection<ChunkId> ids = map.get(key);
List<ChunkId> idList = (Arrays.asList(ids.toArray(new ChunkId[0])));
removeUsedIds(idList);
Collections.sort(idList);
//...
}
}
private void removeUsedIds(List<ChunkId> idList) {
// decrement counter to avoid indexing changed parts of list
for (int i = idList.size() - 1; i >= 0; i--) {
if (usedIdSet.contains(idList.get(i))) {
idList.remove(i); // **** Exception thrown here
}
}
}
e ottengo
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.AbstractList.remove(Unknown Source)
at org.xmlcml.svg2xml.analyzer.PDFIndex.removeUsedIds(PDFIndex.java:104)
at org.xmlcml.svg2xml.analyzer.PDFIndex.findDuplicates(PDFIndex.java:87)
at org.xmlcml.svg2xml.analyzer.PDFIndex.findDuplicatesInIndexes(PDFIndex.java:129)
at org.xmlcml.svg2xml.analyzer.PDFAnalyzer.analyzePDF(PDFAnalyzer.java:188)
at org.xmlcml.svg2xml.analyzer.PDFAnalyzer.analyzePDFFile(PDFAnalyzer.java:115)
at org.xmlcml.svg2xml.analyzer.PDFAnalyzer.main(PDFAnalyzer.java:398)
NOTA: Questo è contrassegnato come un duplicato di remove() on List created by Arrays.asList() throws UnsupportedOperationException ma è significativamente diversa. Quel poster conosceva lo quale fosse il problema e voleva una spiegazione; I non sapeva quale fosse il problema e non riuscivo a trovarlo su SO pubblicando la domanda corrente. Java 6 docs (http://docs.oracle.com/javase/6/docs/api/java/util/ArrayList.html) non fornisce alcun accenno al problema (la sua firma genera IndexOutOfBoundsException
). La domanda precedente utilizzava anche removeAll()
mentre questa domanda faceva riferimento a remove(int)
in modo che la ricerca lessicale fosse meno precisa.
Ho quindi chiesto su SO e ho ottenuto risposte rapide e utili. Perché ho espresso il titolo esattamente (a differenza della domanda precedente) dovrebbe essere facile per gli altri trovare questa risposta. In meno di un giorno ha già quasi tanti voti rispetto alla domanda precedente in un anno (e oltre 100 visualizzazioni), il che suggerisce che sarà molto più utile. Poiché questa domanda è ora collegata alla precedente, penso che aggiunga all'utilità generale senza inquinare SO. (Le risposte attuali sono brevi e non ripetono inutilmente le informazioni.)
Ho modificato la domanda per rimuovere codice estraneo. Se questa domanda fosse stata disponibile quando ho incontrato il problema, mi avrebbe risparmiato un'ora!
quale linea succede? – Infested
Devi aggiungere un'altra informazione: che tipo di elenco hai precedentemente istanziato? – atk
Contrassegnato come un duplicato perché il 'idList' che si sta passando al metodo' removeUsedIds() 'viene creato usando il metodo' Arrays.asList() ', che restituisce un wrapper Elenco attorno all'array, che non supporta la modifica. –