Eigener Datentyp funktioniert nicht

screaper

Mitglied
Hallo Kammeraden.

Ich habe mir eine datenstruktur angelegt die Wiefolgt aussieht:

PHP:
public class GameData {

	private ArrayList<SpielStein> spielSteine = new ArrayList<SpielStein>(); 

		
	public GameData(){
		
		}
	
		public void addStone(SpielStein s){
	
		spielSteine.add(new SpielStein(s.getXPos(), s.getYPos(), s.getCTyp()));
		
	}
	
	public int getNumberOfStones(){
		return spielSteine.size();
	}
	
	public void deleteList(){
		spielSteine.clear();
	}
	public SpielStein getProperties(int i){
		return spielSteine.get(i);
	}
	
}


Die Klasse Spielstein sieht so aus:

PHP:
public class SpielStein implements CommonGuiInterface{

	private int xPos;
	private int yPos;
	private char cTyp;
	private Color color;
	
	
	
	public SpielStein(){}
	
	public SpielStein(int x, int y, char c) {
	
		cTyp = c;
		xPos = x;
		yPos = y;
		setColor(cTyp);
		
		}
	
	private void setColor(char cTyp){
		if(cTyp =='c'){color =CLIENTBOWL;}
		if(cTyp =='s'){color =SERVERBOWL;}
		if(cTyp =='n'){color =SPIELFELDCOLOR;}
		
	}
	
	
	public void setCTyp(char c){
		cTyp = c;
	}
	
		
	public char getCTyp(){
		return cTyp;
	}
	
	public void paintStone(Graphics g){
		if(!(cTyp=='n')){
		g.setColor(color);
		g.fillOval(xPos, yPos, BOWLSIZE, BOWLSIZE);		
	}
		}
	
	
	public int getXPos(){
		return xPos;
	}
	public int getYPos(){
		return yPos;
	}
	
	public Color getCColor(){
		return color;
	}
}



Jetzt möchte ich die Datenstruktur als 2D-Array Nutzen:

PHP:
package logic;
import gui.*;
import com.*;
import java.util.*;
import java.awt.event.*;


public class Play implements CommonGuiInterface {
	
	//Datenstrukturen
	private GameData[][] data;
       int xSize=0;
	int ySize=0;

	public Play (int x, int y, String adresse, int port, int time) {
		
		xSize = x;
		ySize = y;
		
			
		data = new GameData[xSize][ySize];
						
		
		}

		
		
	//Rechnet die Koordinaten fürs Array aus.
	private void identifyCoordinates(MouseEvent e){
		xAxis = (e.getX()/FIELDSIZE);
		yAxis = (e.getY()/FIELDSIZE);
		System.out.println("Feldnummer: "+ xAxis+" "+yAxis);	
		
			}
	
		
	
	public void updateData(int x, int y, int mx, int my){
		addBowleToField(x, y, mx, my);
	//	if(isFull(x, y))calculateNewPositions();
	//	else return;

	}

	//Fügt eine Kugel zur Aktuellen Position hinzu
	private void addBowleToField(int x, int y, int mx, int my ){
		
		char color ='n';
		if (whoseTurnIsIt == 0) color='c';
		if (whoseTurnIsIt == 1) color='s';
		SpielStein st = new SpielStein(mx,my,color);
		data[x][y].addStone(st);
	}
	
}}

Ich bekomme immer eine NullPointerException beim Aufruf von
<B>data[x][y].addStone(st);</b>

Ich stehe auf der Leitung.....

Kann mir jedmand helfen, wie mein Konstrukt funktioniert. Irgendwo ist ein Denkfehler drin. Oder das ganze Konstrukt taugt nix.


PS: ich habe nur den relevanten Code stehen gelassen, der mit dem eigenltichen Problem zu tun hat. Wenn der ganze benötigt wird schick ich ihn nach.

Vielen Dank!

Screaper
 
Hi,


ändere mal folgendes, da es bei dir unnnötig ist.

PHP:
    public GameData(){
        
        }
    
        public void addStone(SpielStein s){
    
        spielSteine.add(new SpielStein(s.getXPos(), s.getYPos(), s.getCTyp()));
        
    }

PHP:
    public GameData(){
        
        }
    
        public void addStone(SpielStein s){
    
        spielSteine.add(s);
        
    }

bo
 
Hey,

habe ja auch nicht gesagt, dass es schon geht :p
Gucke noch drauf, wollte es aber erstmal loswerden.


Bist du dir sicher, dass das Array bzw deren Länge nicht überschritten wird?

Wenn du GameData[3][3] anlegst, dann würde addstone bei x=3 y=2 ja streiken.
Ich finde vorerst keinen Arrayfehler.

bo
 
Vielleicht nochmal als Hintergrundifo:


Es sollen Spielsteine auf einem Brett positioniert werden. Auf einem Feld können mehrere Steine stehen. Deshlab wollte ich eine ArrayList machen, in die ich die Spielsteine so Feld (data[][]) dann abspeichern kann.

Bsp. Auf Feld (3,5) stehen 2 Steine.

Also:

data[3][5].addStones(new Spielstein(param); -> für den ersten Stein
data[3][5].addStones(new Spielstein(param); -> für den zweiten Stein

Ich weiß nicht, ob mein Konstrukt dafür gut ist.

Ich weiß nicht, ob ich da irgendwas initialisieren muss!?
Weil ich schrieb ja dann wild ins Array data[][].

Zuerst vielleicht Feld [2][4], dann [5][0]. Die Daten werden aber korrekt übergeben, da habe ich mir schon debug ausgaben reingemacht. ...
 
Ein Array welches du mit new XYZ[5] anlegst, bietet Platz für 5 Element. Initial sind aber alle Elemente leer. Diese musst du in einer entsprechende Schleife erstmal füllen.

Ansonsten bekommst du natürlich eine NullPointerException. In einer Exception wird dir immer die Zeile angegeben in der sie auftritt. Bei einer NullPointerException ist immer irgendwas vor dem Punkt null. Ist also recht einfach zu finden.
 
Das Problem ist, dass ich a nciht weiß mit was ich es befüllen soll! UNd wenn ich es befüllen möchte kommt die NullPointerException. Ich hatte ja oben beschrieben, dass es bei der AddStones-Anweisung auftritt.

Aber irgendwo ist da der Denkfehler versteckt...
 
Wie gesagt du musst mit einer Schleife alle Element im Array mit new XYZ() initialisieren.
 

Neue Beiträge

Zurück