我编写了一个服务器/客户端代码,使用 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/