我有一个使用网络的 Java 游戏,我有一个客户端(使用套接字)从 ObjectInputStream 中获取对象,在它自己的线程中运行。
Object input = null;
while(true) {
input = in.readObject();
if(input != null) {
listener.gotObject(input);
}
}
这工作得很好。获取该对象并将其传递给侦听器,该侦听器是一个链接到我的主 GameApp 类的类。
从侦听器(NetControl.java):
public void gotObject(Object o) {
System.out.println(o);
app.gotObject(o);
}
“app”是处理所有接收到的新对象并处理它们的实例。
从应用程序(GameApp.java)(编辑:非抽象CardGameApp.java提供更大的上下文):
public void gotObject(Object o) {
// select instance:
if(o instanceof GameList) {
GameList gameList = (GameList) o;
System.out.println("gamelist: " + gameList);
this.lobbyControl.gotGameList(gameList);
}
}
我已经在调试器中运行了这段代码,一次一步,它运行良好。当我正常运行它时,我得到一个空指针(输出如下:)
Game ID: 0. Name: game1. Players: 1 / 1. // the object, as it is printed in Client.java
gamelist: Game ID: 0. Name: game1. Players: 1 / 1. // the object, as it is printed again in GameApp.java
Exception in thread "Thread-1" java.lang.NullPointerException
at com.lgposse.game.app.GameApp.gotObject(GameApp.java:61)
at com.lgposse.game.net.NetControl.gotObject(NetControl.java:47)
at com.lgposse.net.client.Client.run(Client.java:49)
现在,我看到该对象被打印了两次,所以我知道它已被接收……但我得到一个空指针。
我在函数中间添加了一个睡眠函数:
else if(o instanceof GameList) {
GameList gameList = (GameList) o;
System.out.println("gamelist: " + gameList);
try {
Thread.sleep(1000); // sleep 100 still gave null pointer
} catch (InterruptedException e) {}
this.lobbyControl.gotGameList(gameList);
}
并将其设置为睡眠一段时间,这一切终于奏效了。
知道为什么我需要像这样睡觉线程吗?有什么我应该做的不同的事情吗?我不确定为什么我能够在它仍然被认为是空的时候打印它。
编辑:添加了更多上下文。