0

私のアプリケーションでは、スレッドで実行するときにリストから文字列を削除する必要がありますが、次のような例外が発生しました。

Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: item gh not found in list
    at java.awt.List.remove(Unknown Source)
    at org.sample.ChatClient$updateClient$1.run(ChatClient.java:200)
    at java.awt.event.InvocationEvent.dispatch(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$000(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

コード:

final Map<String, String> liHashMap=list;
SwingUtilities.invokeLater(new Runnable() {
    @Override
    public void run() {
        for (Entry<String, String> entry : liHashMap.entrySet()) {
            String client_Name=entry.getKey();
            if(!checkList.containsKey(client_Name)) {
                lst.add(client_Name + "\n");
                checkList.put(client_Name, ipAddress);
            }
        }
        for (Entry<String, String> entry : checkList.entrySet()) {
            String client_Name=entry.getKey();
            if(!liHashMap.containsKey(client_Name)){
                lst.remove(client_Name);//Remove string from list
                checkList.remove(client_Name);
        }
    } 
4

2 に答える 2

1

問題はここにあります。これを変える:

if(!liHashMap.containsKey(client_Name)){
                lst.remove(client_Name);//Remove string from list
                checkList.remove(client_Name);
        }

これに:

if(liHashMap.containsKey(client_Name)){
                lst.remove(client_Name);//Remove string from list
                checkList.remove(client_Name);
        }

あなたのハッシュ マップは、あなたのリストから削除されるアイテムのバッキング ストアであると想定しています。右?したがって、キーがハッシュ マップにあり、したがってリストにある場合にのみ、キーを削除する必要があります。

それが機能しない場合は、削除する必要があるアイテムのリストを維持し、実際にリストにあることを確認してから削除する必要があります。このような:

if(toBeRemovedMap.containsKey(client_Name)){
                lst.remove(client_Name);//Remove string from list
                checkList.remove(client_Name);
        }
于 2013-05-08T14:08:26.413 に答える
0

渡されたIllegalArgumentException値が に存在しない場合、 がスローされますjava.awt.List

を使用すると、渡された値が他に存在する場合にjava.util.List返されます。truefalse

于 2013-05-08T14:08:53.020 に答える