programing

지원되지 않는 조작java.util의 예외입니다.Abstract List.add

projobs 2023. 1. 14. 10:03
반응형

지원되지 않는 조작java.util의 예외입니다.Abstract List.add

코드 블록을 올바르게 실행하는 데 문제가 있습니다.이 코드가 어떻게 기능하는지는 잘 모르겠습니다(서버에서 올바르게 동작하기 위해 오래된 플러그인을 입수하려고 합니다).20분마다 실행되어 에러가 발생합니다.문제가 발생하고 있는 코드의 섹션을 다음에 나타냅니다.

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

}

에러는, 행 42로부터 발생합니다.즉, 다음과 같습니다.

                itemStockMap.get(item.getInfo()).add(item.getStock());

에러는 20분마다 2초 간격으로 2회 발생합니다.

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)

아무쪼록 잘 부탁드립니다.

를 사용하여 에 목록을 만듭니다.Map여기:

itemStockMap.put(item.getInfo(), Arrays.asList(item.getStock()));  

이 메서드는 크기를 조정할 수 없습니다.List어레이에 의해 백업됩니다.이 방법의 설명서에서:

지정된 배열에서 지원하는 고정 크기 목록을 반환합니다.(반환된 목록의 "쓰기"를 배열로 변경합니다).

크기 조정 가능한 것을 사용하려면List(실제로 컨텐츠를 카피합니다), 다음을 사용합니다.

itemStockMap.put(
        item.getInfo(),
        new ArrayList<Integer>(Arrays.asList(item.getStock()))
); 

주의: 일반적으로 다음 내용을 볼 때UnsupportedOperationException에 의해 던져지고 있다add일반적으로 일부 코드가 크기를 조정할 수 없거나 수정할 수 없는 컬렉션을 수정하려고 시도하고 있음을 나타냅니다.

예를들면,Collections.emptyList또는Collections.singletonList(수정할 수 없는 컬렉션을 반환한다)는 최적화로 사용할 수 있지만 실수로 변경을 시도하는 메서드로 전달됩니다.따라서 콜렉션을 수정하기 전에 콜렉션을 방어적으로 복사하는 것이 좋습니다(물론 콜렉션을 수정하는 것이 메서드의 의도된 부작용이 아닌 한).이렇게 하면 콜렉션을 변경할 필요가 있는지 여부에 대해 신경 쓰지 않고 가장 적절한 콜렉션 구현을 자유롭게 사용할 수 있습니다.

당신 문제를 해결한 것 같아요. Arrays.asList(item.getStock())는 전달된 어레이에 따라 고정된 크기 목록을 반환합니다.

즉, 요소를 추가할 수 없습니다.

대신 당신이 해야 합니다.new ArrayList(Arrays.asList(item.getStock())).

이렇게 하면 추가할 수 있는 새 목록을 만들 수 있습니다.

문제는 Arrays.asList를 사용하여 목록을 작성하는 것입니다.제공된 javadoc에 따르면 반환된 목록은 고정 크기이므로 추가는 지원되지 않습니다.반환된 목록을 arrayList 복사 컨스트럭터로 랩하면 설정이 완료됩니다.

내 경우 다음을 사용했습니다.

List<File> removeFilesList= Collections.emptyList();

그 결과 파일 배열 목록이 추상화되었습니다.대신 사용:

List<File> removeFilesList= new ArrayList<>();

그리고 오류는 수정되었습니다.

List는 Interface이며 ArrayList 인스턴스가 될 때까지 값을 추가할 수 없습니다(인터페이스는 일부 클래스에서 구현해야 합니다).

예:

    List<Integer> test = new ArrayList<>();
    test.add(new Integer(2));

    ArrayList<Integer> test2 = new ArrayList<>();
    test2.add(new Integer(2));

    List<Integer> test3 = Collections.EMPTY_LIST;
    test3.add(new Integer(2));

여기서 오브젝트 테스트와 test2ArrayList 클래스의 오브젝트이기 때문에 추가가 가능하기 때문에 완벽합니다.
test3에서는 빈 목록일 뿐이므로 요소를 추가할 수 없습니다.

저도 같은 실수를 하고 있었어요.

Add 또는 Remove, Use List only reference 등의 작업을 수행해야 하는 경우의 권장 Array List를 다음에 나타냅니다.

 Map<ItemInfo, ArrayList<Integer>> itemStockMap = Collections.synchronizedMap(new HashMap<ItemInfo, ArrayList<Integer>>());

는 이 되는 것입니다.get 되지 .add.AbstractList.

목록 클래스가 무엇인지, 그리고 (커스텀 코드인 경우) 소스 코드를 보지 않고는 더 이상 말할 수 없습니다.

목록을 가져오기 위해 getter를 사용했는데 고정된 크기의 목록이 반환되어 새 요소를 추가할 수 없습니다.

대신 당신이 해야 합니다.

new ArrayList(Arrays.asList(item.getStock()))

언급URL : https://stackoverflow.com/questions/9320409/unsupportedoperationexception-at-java-util-abstractlist-add

반응형