Salve. Non riesco a capire il motivo dell'errore che ho messo come titolo al thread.
Devo caricare un ImageIcon come sfondo a delle JLabel ogni volta che l'utente tira il suo dado,
però in un certo punto del codice ottengo nullPointerException.

Posto la parte di codice relativa alla gestione di questa cosa:

Dado

codice:
public class Dado {
	
	private int[] valori;
	private int valore;
	
	public Dado() {
		valori = new int[6];
		valori[0] = 1;
		valori[1] = 2;
		valori[2] = 3;
		valori[3] = 4;
		valori[4] = 5;
		valori[5] = 6;
	}
	
	public String getValoreStr() {
		switch(valore) {
			case  1: return "uno";
			case  2: return "due";
			case  3: return "tre";
			case  4: return "quattro";
			case  5: return "cinque";
			case  6: return "sei";
			default: return "-";
		}
	}
	
	public int getNumeroCasuale() {
		int indice = (int) (Math.random()*6);
		valore = valori[indice];
		return valori[indice];
	}
	
	public String getUrlImage() {
		String url = "images/" + getValoreStr() + ".png";
		return url;
	}
}
Nella partita..

codice:
//E' il turno del computer
			if (turno == 0) {
				try {
					//Il computer attende 500 millisecondi prima di giocare
					Thread.sleep(500);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				int risultato = dado.getNumeroCasuale();
				System.out.println("Il computer ha ottenuto " + risultato);
				giocatoreA.setGiocata(risultato);
				setChanged();
				Messaggio m = new Messaggio();
				String text = buildMessage(1);
				m.setText(text);
				m.setX(x);
				m.setY(y);
				m.setUrlDado(dado.getUrlImage());
				notifyObservers(m);
				turno = 1;
				x++;
				i++;
			}
			// E' il turno dell'utente
			if (turno == 1) {
				while (userHavePlayed == false) {
					try {
						wait();
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
				userHavePlayed = false;
				setChanged();
				int risultato = dado.getNumeroCasuale();
				System.out.println("Hai ottenuto " + risultato);
				giocatoreB.setGiocata(risultato);
				Messaggio m = new Messaggio();
				String text = buildMessage(2);
				m.setText(text);
				m.setX(x);
				m.setY(y);
				m.setUrlDado(dado.getUrlImage());
				notifyObservers(m);
				turno = 0;
				x++;
				i++;
			}
Nella griglia, che osserva la Partita
E' qui che ho localizzato il nullPointerException, che non avviene immediatamente. Per i primi due tiri le facce dei dadi compaiono.

codice:
public void update(Observable obs, Object obj) {
		Messaggio m = (Messaggio) obj;
		int x = m.getX(); // indice colonna
		int y = m.getY(); // indice riga
		//Ottengo l'immagine relativa al dado (dopo un po, nullPointerException!)
		String pathDado = m.getUrlDado();
		System.out.println("Path dado: " + pathDado);
		Image dado = Toolkit.getDefaultToolkit().createImage(pathDado);
		ImageIcon iconDado = new ImageIcon(dado);	
		labels[y][x].setOpaque(true);
		labels[y][x].setIcon(iconDado);
	}
Messaggio

codice:
public class Messaggio {
	
	private String text;
	private int x;
	private int y;
	private String urlDado;
	
	public Messaggio() {
		x = 0;
		y = 0;
	}
	
	public void setUrlDado(String url) {
		urlDado = url;
	}
	
	public String getUrlDado() {
		return urlDado;
	}
	
	public String toString() {
		return text;
	}
	
	public void setText(String t) {
		text = t;
	}

	public void setX(int x) {
		this.x = x;
	}

	public void setY(int y) {
		this.y = y;
	}

	public int getX() {
		return x;
	}

	public int getY() {
		return y;
	}
}
Ho fatto una prova. Nel metodo update() di messaggio ho provato a impostare solo il colore di sfondo delle JLabel, e funziona perfettamente. Nel frattempo ho messo delle stampe
in Partita per vedere se stampa il path corretto di ogni immagine relativa al dado giocato. E avviene correttamente! Nella Partita dunque il path viene rilevato ed impostato correttamente nel messaggio. Poi boh..