Compiler-Fehler Exception in thread "main" java.lang.NullPointerException

anonymous91

Mitglied
Ich soll ein Tic-Tac-Toe Spiel programmieren. oder anders gesagt "x" und "o". 3 x 3 Felder sollen es sein.
Ich habe den Code geschrieben, aber kriege den Fehler "Exception in thread "main" java.lang.NullPointerException" bei dem Aufruf des Konstruktors der Klasse. Ich weiß leider nicht, wie ich den Fehler beseitigen kann.

Freue mich auf eure Hilfe 🙂

Hier die Mainmethode

Java:
import java.io.*;

public class Ttest {

	public static void main(String[] args) throws IOException{
	
		TTT x = new TTT();
		TTT o = new TTT();
		int reihe[] = new int [9];
		int spalte[] = new int [9]; 
		
		
		BufferedReader buffer = new BufferedReader(new InputStreamReader(System.in));
		
		for (int i = 0; i < 9; i++)
		{
			if (i % 2 == 0){
				System.out.println("Spieler x: Bitte geben Sie die Reihenzahl ein: ");
				reihe[i] = Integer.parseInt(buffer.readLine ());
				System.out.println("Spieler x: Bitte geben Sie die Spaltenzahl ein: ");
				spalte[i] = Integer.parseInt(buffer.readLine ());
			 
			 x.x(reihe[i], spalte[i]);
			}
			
			else{
				System.out.println("Spieler o: Bitte geben Sie die Reihenzahl ein: ");
				reihe[i] = Integer.parseInt(buffer.readLine ());
				System.out.println("Spieler o: Bitte geben Sie die Spaltenzahl ein: ");
				spalte[i] = Integer.parseInt(buffer.readLine ());
			 
			 o.o(reihe[i], spalte[i]);	
			}
			
			TTT.print(); // Spielfeld ausgeben 
			System.out.println();
			
			// Nachdem der erste Nutzer 3 mal eingegeben hat, muss ueberprueft werden
			//ob jemand gewonnen hat
			if ( i >= 4){
				if (x.gewonnen('x'))
					System.out.println("Spieler x hat gewonnen");
				if (o.gewonnen('o'))
					System.out.println("Spieler o hat gewonnen");
			}
		}
		
		
	}

}

und eine Klasse

Java:
public class TTT {

	private static char spielfeld [];
	
	TTT (){ // Konstruktor, alle Felder leeren
		for (int i = 0; i < 9; i++){ 
			
				spielfeld[i] =  ' ';
			
		}	
	}
    
	void x(int zeile, int spalte){
		
		if ( 0 > zeile || zeile > 2 || 0 > spalte || spalte > 2
				|| spielfeld[zeile*3 + spalte] != ' '){
			System.out.println("Inhalt schon besetzt bzw. ungueltige Zeile oder Spalte");
			System.exit(1);
			// Wenn Zeile oder Spalte nicht zwischen 0 und 2 liegt
			// oder deren Inhalt besetzt ist, programm beenden
		}
		
		else{
			spielfeld[zeile*3 + spalte] = 'x';
		}

	}
	
	void o(int zeile, int spalte){
		
		if ( 0 > zeile || zeile > 2 || 0 > spalte || spalte > 2
				|| spielfeld[zeile*3 + spalte] != ' '){
			System.exit(1);
			// Wenn Zeile oder Spalte nicht zwischen 0 und 2 liegt
			// oder deren Inhalt besetzt ist, programm beenden
		}
		
		else{
			spielfeld[zeile*3 + spalte] = 'o';
		}

	}

	
	static void print(){
		// Ausgabe des Spielfeldes
		for (int i = 0; i < 3; i = i + 3){
			for (int j = i; j < 3; j++){ //Schleife fuer Reihen
				System.out.print(spielfeld[j]);	
			}	
			System.out.println();	
		}
	}
	
	boolean gewonnen(char spieler){
		
		// Die 3 Reihen pruefen
		for (int i = 0; i < 9; i = 3*i ){
		 if (spielfeld[i] == spielfeld[i+1]  && spielfeld[i+1] == spielfeld[i+2]
			 && spielfeld[i +2] == spieler)
			 return true;
		}
		
		// Die 3 Spalten + die 2 Diagonale pruefen
		for (int i = 0; i < 3; i++ ){
			 if (spielfeld[i] == spielfeld[i+3] && spielfeld[i+3] == spielfeld[i+6]
			     && spielfeld[i +6] == spieler)
			 return true;
			 
			 if (i == 0)
			 {
				 if (spielfeld[i] == spielfeld[i + 4] && spielfeld[ i + 4] == spielfeld[i + 8] 
							&& spielfeld[i + 8] == spieler)
						return true;
					
			 }
			 if (i == 2)
			 {
				 if (spielfeld[i] == spielfeld[i + 2] && spielfeld[ i + 2] == spielfeld[i + 4] 
							&& spielfeld[i + 4] == spieler)
						return true;
					
			 }
		}	

		return false;
	}
	
}
 
In der Exception steht die Zeile.

Google sagt dir, was eine Null-Reference ist.

Mit diesen Informationen kann man das Problem nicht lösen? - Ich habe keine Lust zu schauen, wo hier eine NPE fliegt.

Gruß,

Martin
 
Die NPE fliegt hier

Java:
   private static char spielfeld [];
    
    TTT (){ // Konstruktor, alle Felder leeren
        for (int i = 0; i < 9; i++){ 
            
                spielfeld[i] =  ' ';
            
        }   
    }

is mir nur grad beim ersten lesen aufgefallen aber so wie der code aussieht werden da wohl noch genug andere Fehler drin sein
 
immer wieder schön ... exceptions als compiler-fehler zu markern ...

@TO
exceptions treten während der RUNTIME auf ... ergo muss der compiler erfolgreich durchgelaufen sein ... wie kommst du dann also auf die idee es wäre ein COMPILETIMEERROR ?
 

Zurück
Oben