Java java.lang.NullPointerException...

Vulpecula

Commander
Registriert
Nov. 2007
Beiträge
2.247
Hallo zusammen!

Kann mir eventuell jemand sagen, wieso ich eine NullPointerException rausgeschmissen bekomme? Erstmal der Code:

Code:
package matrixoo;

public class Matrix {

	private int[][] matrix = null;
	private int zeilen = 0;
	private int spalten = 0;
	
	//Konstruktor
	public Matrix(int givenZeilen, int givenSpalten) {
		zeilen = givenZeilen;
		spalten = givenSpalten;
		matrixFuellen(zeilen,spalten);
	}
	
	 private void matrixFuellen(int givenZeilen, int givenSpalten) {
		for (int zeile=0; zeile < givenZeilen; zeile++){
			for (int spalte=0; spalte < givenSpalten; spalte++){
				this.matrix[zeile][spalte] = (int)(1 + Math.random()* 100);
			}
		}
	}

	void matrixAusgeben(){
		for (int zeile=0; zeile < matrix.length; zeile++){
			for (int spalte=0; spalte < matrix[zeile].length; spalte++){
				System.out.print("\t" + matrix[zeile][spalte]);
			}
		System.out.println();			
		}				
	}		

}

In der main erstelle ich jetzt einfach ein Objekt:

Code:
Matrix matrix1 = new Matrix(4,4);

und eigentlich sollte die Matrix doch jetzt gefüllt werden, oder sehe ich das falsch. Ich vermute irgendwo eine derart trivialen Fehler, dass es Faceplams hageln wird...

MfG - Vulpecula
 
private int[][] matrix = null;

du müsstest im konstruktor noch die größe der matrix angeben die du anlegen willst,

matrix = new int[zeilen][spalten]

und dann die methode zum auffüllen aufrufen. anders ist matrix immer gleich null und daher die null-pointer exception
 
Sowas habe ich mir fast gedacht... Aber wie kann ich das am geschicktesten umgehen? Immerhin soll das Array eine Klassenvariable sein, daher kann ich es nicht erst im Konstruktor deklarieren. :(

Okay, hatte gerade einen Erkenntnisgewinn. Ich muss öfter mal mein Hirn anschalten. :p
 
Zuletzt bearbeitet:
naja, die frage ist doch eigentlich, brauchst du denn die matrix[][] oder reicht es nicht, wenn du in der methode füllen eine matrix anlegst?
 
du lasst bei private int[][] matrix das = null weg und fügst im Konstruktor matrix = new int[zeilen][spalten] ein.
 
@noob22222, das hatte ich ja schon vorgeschlagen (im konstruktor setzen). und er kann die variable ruhig null setzen. denn ist die variable nicht initialisiert, dann wird ihr eh null zugeordnet

ich frage mich nur, was er vorhin mit seinem durchgestrichenen meinte
 
Mit matrix = new int[zeilen][spalten] ist alles in Butter. Ich verstehe nur noch nicht so ganz, wieso ich im Konstruktor mit dem new-Befehl arbeiten muss. Wird das Array da nur initialisiert (bzw. eine Größe wird angegeben) oder wird ein vollkommen neues Objekt angelegt?

Das =null wegzulassen hat doch im Prinzip keine Auswirkungen, da, sobald ich das Array anlege, es erstmal null ist.
Ergänzung ()

@nik_: Ich war etwas schnell beim lesen, habe "...im Konstruktor..." überlesen und hatte vor Augen, dass ich die Größe bei der Deklaration der Klassenvariable festlegen soll, was mir folglich die dynamische Größe zunichte gemacht hätte. Die brauche ich, da das Programm ja noch lange nicht fertig ist. ;)
 
Bei der Deklaration eines Arrays wird der eigentliche Container erzeugt. Das bedeutet, dass das Array zunächst exakt in seiner Größe und Typ bestimmt wird.

Möglich ist die Verwendung aller elementaren und benutzerdefinierten Datentypen. Die Deklaration wird mit dem Datentyp eingeleitet, gefolgt vom Namen des Arrays. Wichtig ist die Kennzeichnung des Arrays mit den eckigen Klammeroperatoren, welche eine Array - Variable ausweisen. Dabei spielt es keine Rolle, ob diese nach dem Typ oder dem Namen erscheinen. Zum Abschluß wird das Array noch mit dem New - Operator auf dem Speicher instanziiert, da es sich um eine Objektinstanz handelt. Auch wenn diese nicht sofort erfolgen muss, sollte sie dennoch spätestens im Konstruktor der Klasse instanziiert werden.

da oben hab ich mal nen zitat
 
Coole Sache, wo hast Du das her?

Hm... Ich sehe gerade auch, dass es in der Sprachspezifikation drin steht, wenn auch weniger explizit:

The declarations above do not create array objects. The following are examples of declarations of array variables that do create array objects:

Exception ae[] = new Exception[3];
Object aao[][] = new Exception[2][3];
 
Wieso die Dimensionen mit komischen Namen fest abspeichern, wenn Java doch passende Methoden dafür hat, die dann notfalls gecached werden?

EDIT:
Absurderweise tust du das sogar.
Dazu muss ich sagen, dass du Jagged-Arrays verwendest. Das heißt, dass length kein Methodenaufruf ist. Heißt du musst/solltest ihn nichtmal cachen.
 
Zurück
Oben