NullPointer przy wątkach

0

Cześć. Jest to mój pierwszy projekt z wątkami i socketami w Javie, generalnie pierwszy projekt w Javie...
Tworzę grę "piłka" (sieciówka z wątkami), niestety po podłączeniu graczy dostaję taki komunikat:

Exception in thread "Thread-0" java.lang.NullPointerException
at PrivateRoom.setOpponent(PrivateRoom.java:32)
at WaitingRoom.run(WaitingRoom.java:119)
at java.lang.Thread.run(Thread.java:745)

Jak to wygląda:
W jednym wątku po stronie serwera mam logowanie i parsowanie poleceń przychodzących od klienta.
Następnie jeśli przyjdzie polecenie "CREATE TABLE" to tworzy mi nowy stół (pokój) do gry. Gracz, który wywołał to polecenie staje się "adminem" stołu. Stół to osobna klasa, gdzie mam 2 graczy (p1, p2). Admin stołu to zawsze p1.

Następnie jak inny gracz wyśle polecenie JOIN "nazwa_stołu" to szuka stołu o nazwie "nazwa_stołu" i na obiekcie tego stołu wywołuje funkcję "setOpponent", która przypisuje p2 = osoba, która wywołała "JOIN..."

Każdy taki stół to osobny wątek. No i tutaj się sypie, ponieważ gdy zakładam stół (tworzy nowy wątek) wszystko jest ok, gracz1 jest przypisywany do p1. Natomiast potem łącze gracza2, odszukuje stół stworzony przez gracza1, klikam "join" i wyskakuje mi powyższy błąd. Czy ktoś wie, jak to naprawić ?

Dołączenie po stronie serwera:

// WaitingRoom.java
else if(recive.contains("JOIN"))
{
	String tName = recive.replaceFirst("JOIN ", "");
	for(PrivateRoom pr : privateRooms)
	{
		if(pr.getTableName().equals(tName))
		{
			pr.setOpponent(c); // 119 linijka WaitingRoom tutaj sie sypie
		}
	}
}
// PrivateRoom.java
public synchronized void setOpponent(PlayerConnection p)
{
	this.p2 = p;
	this.p2.setPlayerStatus(true);
	this.setOpponentPlayer(this.p2);
	System.out.println("Player " + this.p2.getName() + "joined to room " 
		       + tableName);
}

// a Tak wygląda konstruktor i pola w PrivateRoom.java
public class PrivateRoom implements Runnable
{
	public static int roomCount = 0;
	
	private volatile PlayerConnection p1, p2;
	private PlayerConnection currentPlayer;
	private PlayerConnection opponentPlayer;
	
	private String tableName;
	private boolean closeSignal = false;
	
	public PrivateRoom(PlayerConnection p1, String tName)
	{
		roomCount++;
		this.p1 = p1; /* p1 zawsze jest adminem stolu */
		this.p2 = null; // null, bo jak tworze to nie wiem kto będzie drugim playerem, czekam na dołączenie 
		this.tableName = tName + "room#" + roomCount;
		this.currentPlayer = this.p1;
		p1.setPlayerStatus(true);
		System.out.println("Private room " + tableName + " has been created by " 
				   + p1.getName());
		
	}

Z góry dzięki ;]

dodanie znacznika <code class="none"> - @furious programming

0

nie wiem jakim cudem w ArrayList mam "nulle" ale to pomogło sprawdzenie czy "c" nie jest nullem:

for(PlayerConnection c : playersConnected)
{
...
...
if(c == null) break;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1