将hashmap从服务器发送到客户端时出现Java Null指针异常

时间:2014-07-20 08:35:09

标签: java serialization objectoutputstream

我编写了一个服务器/客户端代码,使用ObjectOutputStream从服务器向客户端发送哈希映射。我还编写了一个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();
            }
        }
    };
};

1 个答案:

答案 0 :(得分:2)

我看了一下Grepcode上的源代码,试图找出stacktrace的含义。行号对Java 8 version of the code有意义,但不适用于旧版本。

但除此之外,很难说。看起来currContext对象中的ObjectOutputStream内部字段是null,但我在1500行之前的代码读取是不可能发生的!

除非......

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

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