我编写了一个服务器/客户端代码,使用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();
}
}
};
};
答案 0 :(得分:2)
我看了一下Grepcode上的源代码,试图找出stacktrace的含义。行号对Java 8 version of the code有意义,但不适用于旧版本。
但除此之外,很难说。看起来currContext
对象中的ObjectOutputStream
内部字段是null
,但我在1500行之前的代码读取是不可能发生的!
除非......
...有两个线程试图使用相同的ObjectOutputStream
而没有正确同步。请记住,ObjectOutputStream
未被记录为线程安全的,并且不会在内部同步。
这就是我对导致NPE的原因的理论。