Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ConcurrentModificationException ObjectOutputStream.writeObject()_Java_Sockets_Objectoutputstream_Concurrentmodification - Fatal编程技术网

Java ConcurrentModificationException ObjectOutputStream.writeObject()

Java ConcurrentModificationException ObjectOutputStream.writeObject(),java,sockets,objectoutputstream,concurrentmodification,Java,Sockets,Objectoutputstream,Concurrentmodification,在socket编程中,我试图向服务器发送一个对象,然后它抛出ConcurrentModificationException。它并不是在每次迭代中都抛出异常。 我正在尝试在服务器上发送可序列化的对象 客户守则- Message request = new Message(); request.setMessage("request"); request.setSourceNode(node); System.out.println("cs enter

在socket编程中,我试图向服务器发送一个对象,然后它抛出
ConcurrentModificationException
。它并不是在每次迭代中都抛出异常。 我正在尝试在服务器上发送可序列化的
对象

客户守则-

Message request = new Message();
        request.setMessage("request");
        request.setSourceNode(node);
        System.out.println("cs enter "+ node.getId());
        for(Integer i : clientThread.keySet())
        {
            //clientThread.get(i).sendMessage("request");
            clientThread.get(i).sendMessage(request);
        }
服务器上的代码-

public synchronized void sendMessage(Message send)
     {
         //System.out.println("Client request time stamp" + main.node.getRequestTimestamp());
         send.setDestinationNode(destinationNode);
         //System.out.println(send.getMessage() + " " + send.getSourceNode().getId() + " "+ send.getDestinationNode().getId());
         try {
            oos.writeObject(send);
            oos.reset();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
     }
堆栈跟踪:

Exception in thread "main" java.util.ConcurrentModificationException
    at java.util.ArrayList.writeObject(ArrayList.java:766)
    at sun.reflect.GeneratedMethodAccessor2.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:988)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1496)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
    at Client.sendMessage(Client.java:45)
    at Main.csEnter(Main.java:176)
    at Main.main(Main.java:75)

为什么要使用序列化API发送它?为什么不改用JSON呢?请同时发布堆栈跟踪。一个可能的原因是您在遍历它时更改了客户端线程的数量。发送邮件时包括或删除客户端。我不会在初始化后修改客户端线程hashmap,并在每次发送消息时使用相同的hashmap。我的代码在前4次迭代中运行,之后它会抛出这个异常。是的,它也可能是从HashMap生成的。您可以尝试使用ConcurrentHashMap。为什么要使用序列化API发送它?为什么不改用JSON呢?请同时发布堆栈跟踪。一个可能的原因是您在遍历它时更改了客户端线程的数量。发送邮件时包括或删除客户端。我不会在初始化后修改客户端线程hashmap,并在每次发送消息时使用相同的hashmap。我的代码在前4次迭代中运行,之后它会抛出这个异常。是的,它也可能是从HashMap生成的。您可以尝试使用ConcurrentHashMap。