UnsupportedOperationException à java.util.AbstractList.ajouter
Je vais avoir des problèmes à obtenir un bloc de code à exécuter correctement. Je ne suis pas entièrement sûr de CE que ce code n' (je vais essayer d'obtenir un plugin qui est hors de date pour fonctionner correctement avec notre serveur), je sais juste que toutes les 20 minutes, il s'exécute et jette une erreur. Voici la section de code où le problème se pose:
public class DynamicThread extends Thread {
private LocalShops plugin = null;
public DynamicThread(ThreadGroup tgroup, String tname, LocalShops plugin) {
super(tgroup, tname);
this.plugin = plugin;
}
public void run() {
Map<ItemInfo, List<Integer>> itemStockMap = Collections.synchronizedMap(new HashMap<ItemInfo, List<Integer>>());
//Dump all the shop stock data into the map.
for ( Shop shop : plugin.getShopManager().getAllShops() ) {
for ( InventoryItem item : shop.getItems() ) {
if (itemStockMap.containsKey(item.getInfo()))
itemStockMap.get(item.getInfo()).add(item.getStock()); //Where error happens
else
itemStockMap.put(item.getInfo(), Arrays.asList(item.getStock()));
}
}
for(ItemInfo item : itemStockMap.keySet()) {
List<Integer> stockList = GenericFunctions.limitOutliers(itemStockMap.get(item));
//remove the map before re-adding it
if (DynamicManager.getPriceAdjMap().containsKey(item))
DynamicManager.getPriceAdjMap().remove(item);
//Get the overall stock change for a given item and then calculate the adjustment given the volatility
int deltaStock = GenericFunctions.getSum(stockList) - Config.getGlobalBaseStock();
DynamicManager.getPriceAdjMap().put(item, GenericFunctions.getAdjustment(Config.getGlobalVolatility(), deltaStock));
}
Bukkit.getServer().getScheduler().callSyncMethod(plugin, plugin.getShopManager().updateSigns());
}
}
L'erreur se produit à partir de la ligne 42, qui est:
itemStockMap.get(item.getInfo()).add(item.getStock());
L'erreur, il les sorties qui se passe toutes les 20 minutes deux fois avec 2 secondes entre les deux.
2012-02-16 16:53:25 [INFO] Launch Dynamic Thread
2012-02-16 16:53:25 [SEVERE] Exception in thread "dynamic"
2012-02-16 16:53:25 [SEVERE] java.lang.UnsupportedOperationException
2012-02-16 16:53:25 [SEVERE] at java.util.AbstractList.add(AbstractList.java:131)
2012-02-16 16:53:25 [SEVERE] at java.util.AbstractList.add(AbstractList.java:91)
2012-02-16 16:53:25 [SEVERE] at com.milkbukkit.localshops.threads.DynamicThread.run(DynamicThread.java:42)
2012-02-16 16:53:27 [INFO] Launch Dynamic Thread
2012-02-16 16:53:27 [SEVERE] Exception in thread "dynamic"
2012-02-16 16:53:27 [SEVERE] java.lang.UnsupportedOperationException
2012-02-16 16:53:27 [SEVERE] at java.util.AbstractList.add(AbstractList.java:131)
2012-02-16 16:53:27 [SEVERE] at java.util.AbstractList.add(AbstractList.java:91)
2012-02-16 16:53:27 [SEVERE] at com.milkbukkit.localshops.threads.DynamicThread.run(DynamicThread.java:42)
Merci d'avance pour toute aide.
- Avez-vous remplacé equals et hashcode sur ItemInfo objet, parce que vous faites un containsKey appel sur la table de hachage. (itemStockMap.containsKey(item.getInfo()))
InformationsquelleAutor Erickj92 | 2012-02-16
Vous devez vous connecter pour publier un commentaire.
Vous utilisez
Tableaux.asList()
de créer des listes dans laMap
ici:Cette méthode retourne un non redimensionnable
List
soutenu par le tableau. À partir de cette méthode de documentation:À l'utilisation de l'redimensionnable
List
(et réellement copier le contenu), utilisez la commande suivante:Remarque: en général, quand il voit que
UnsupportedOperationException
est jeté paradd
, etc. c'est généralement une indication que le code est en train d'essayer de modifier un non redimensionnable ou inmodifiable collection.Par exemple,
Collections.emptyList
ouCollections.singletonList
(qui renvoient inmodifiable collections) peut être utilisé comme optimisations mais accidentellement être passé dans des méthodes qui tentent de les modifier. Pour cette raison, il est une bonne pratique pour les méthodes pour rendre la défensive des copies des collections avant de les modifier (à moins que la modification de la collection est une méthode destinée effet secondaire) - de cette façon, les appelants sont libres d'utiliser le plus approprié de la collection de la mise en œuvre sans se soucier de savoir s'il doit être modifiable.Je crois que j'ai compris votre problème.
Arrays.asList(item.getStock())
renvoie une taille fixe la liste basé sur le Tableau passé.Cela signifie que vous ne pouvez pas ajouter plus d'éléments.
Au lieu de cela, vous devriez faire
new ArrayList(Arrays.asList(item.getStock()))
.De cette façon, vous créez une nouvelle liste que vous pouvez ajouter à.
Le problème est que vous êtes la création de vos listes avec Les tableaux de.asList. Par la javadoc fourni, de la liste retournée est une Taille Fixe, donc ajouter seraient pas pris en charge. Envelopper la liste retournée dans un constructeur de copie pour arrayList et vous devriez être en jeu.
Liste est de l'Interface et vous ne pouvez pas Ajouter de la valeur en elle jusqu'à ce qu'il est en instance de ArrayList(interface doit être implémentée par une classe)
Par Exemple:
Ici l'Objet test et test2 sont parfaits, parce qu'ils sont l'objet de la classe ArrayList donc plus possible
Tandis que dans test3 il est tout simplement vide de la liste de sorte que vous ne pouvez pas ajouter un élément en elle.
J'ai aussi été faire la même erreur.
Voici ma Suggestion Utiliser ArrayList lorsque vous avez à faire des opérations comme par exemple, ajouter ou supprimer, l'Utilisation de la Liste uniquement pour des fins de référence.
Le problème est dans la classe de la liste d'objet qui est retourné par la
get
appel. Il ne modifie pas laadd
méthodes de manière appropriée, et que votre code est, par conséquent, en utilisant l'espace réservé méthode prévue parAbstractList
.Il n'y a pas beaucoup plus que nous pouvons dire, sans savoir ce que la liste de la classe est, et (si il est de coutume de code) voir le code source.