从服务器向客户端发送 HashMap 时发生 Java 空指针异常

标签 java serialization objectoutputstream

我编写了一个服务器/客户端代码,使用 ObjectOutputStream 从服务器向客户端发送 HashMap 。我还编写了一个 update 函数,每 50 毫秒调用一次来发送该 hashMap。

public void update() {
    try {
        //oos is an objectoutput stream
        HashMap<String, HashMap<String, Integer>> hash = new HashMap<>();
        for (int j = 0; j < objects.size(); j++)
            hash.put(objects.get(j).toString(), judge.getInfo(objects.get(j)));
        for (int i = 0; i < 2; i++) {
            oos[i].writeObject("money#"
                    + judge.getMoney(player[i].getTeam()));
            //System.out.println(judge.getMoney(player[i].getTeam()));
            oos[i].writeObject("time#" + judge.getTime());
            if(hash==null)
                System.out.println("HASH"+hash);
            if(oos[i]==null)
                System.out.println("nulllllllll");
            oos[i].writeObject(hash); //*****line 229 of Game.java ******/
            oos[i].flush();

            //oos[i].reset();
            //System.out.println(hash.size());
        }

    } catch (IOException ioe) {
        ioe.printStackTrace();

    } catch (MahyariseExceptionBase meb) {
        // TODO
    }

}

有时上面的代码会抛出这样的异常:

java.lang.NullPointerException
     at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1500)
     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 network.Game.update(Game.java:229)
     at judge.judge.next50milis(judge.java:403)
     at judge.judge$1.run(judge.java:421)
     at java.util.TimerThread.mainLoop(Timer.java:555)

该 HashMap 的大小很小,如果 update 函数每 1000 毫秒调用一次,我们可以看到抛出上述异常。

遵循客户端代码:

    Thread read = new Thread() {
    public void run() {
        while (running) {
            Object a=null;
            try {
                if (socket.isConnected() && !socket.isClosed()) {
                    a = inputStream.readObject();
                    if (a != null)
                        analyze(a);
                }
            } catch (ClassNotFoundException e) {
                 e.printStackTrace();
            } catch (IOException e) {
                loose();
            }
        }
    };
};

最佳答案

我查看了 Grepcode 上的源代码,试图弄清楚堆栈跟踪的含义。行号对于 Java 8 version of the code 有意义,但不包括旧版本。

但除此之外,就很难说了。看起来 ObjectOutputStream 对象中的 currContext 内部字段为 null,但我对第 1500 行之前的代码的阅读是它可以'不会发生!

除非...

...有两个线程尝试使用相同的ObjectOutputStream,但未正确同步。请记住,ObjectOutputStream 未记录为线程安全的,并且不会在内部同步。

这就是我对导致 NPE 的原因的理论。

关于从服务器向客户端发送 HashMap 时发生 Java 空指针异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24848757/

相关文章:

c# - 如何将类序列化为属性?

java - 对象到字节数组的部分序列化

java - 通过 ObjectOutputStream 发送相同但已修改的对象

java - 带+号的字符串到Int

java - 执行 attach-javadocs of goal org.apache.maven.plugins :maven-javadoc-plugin:3. 0.0:jar failed with Java10

c# - Xml 序列化为 XmlAttribute : namespace prefix lost when Element in same namespace

c# - 如何使用泛型类型的 DataContractSerializer 编写自定义序列化器?

java - 出现 java.io.NotSerializedException 错误

java 实例方法和变量的继承解析

java - 如何计算Hadoop Map-Reduce中一组数据的居中移动平均?