У меня есть Java-игра, в которой используется сеть, и у меня есть клиент (используя Socket), который извлекает объекты из ObjectInputStream, работающие в своем потоке.Выполнение Java-кода сети до получения объекта
Client.java От:
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);
}
«приложение» является экземпляр, который обрабатывает все новые объекты, полученные и сделок с ними.
Из приложения (GameApp.java) (Edit: неабстрактный 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)
Теперь я вижу объект печатаемого дважды, так что я знаю, что это было получено ... но я получаю null указатель.
Я добавил функцию сна в середине функции:
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);
}
и установка его спать на некоторое время, все это наконец-то работал.
Любая идея, почему мне нужно спать в этой теме? Есть ли что-то, что я должен делать по-другому? Я не уверен, почему я смог напечатать объект, пока он все еще считается нулевым.
Редактировать: добавлен контекст.
Дополнительная информация: Я спросил друга об этом, и он упомянул о блокировке, например. ожидая, что что-то будет готово в первую очередь. Я не знаком с этой концепцией, но я предполагаю, что я могу сделать, это подождать, пока мой объект будет полностью принят (псевдокод: Thread.sleep (UNTIL OBJECT FULLY RECEIVED), но я не уверен, как это будет (или как проверить, когда это будет сделано.) –
Когда мне нужно подождать нить (или несколько), я использую CountDownLatch для синхронизации. – Fernando
Почему вы тестируете нуль? Планируете ли вы отправлять нули? – EJP