NullPointerExeption in Array

Pauli85

Mitglied
Hallo,
ich habe die Aufgabe aus einer Datei Koordinaten einzulesen (sind ca. 100.000 Stück) und diese dann zeichnen zu lassen. Dazu soll ich beim Einlesen die Koordinaten zuerst in einem Point-Objekt speichern. Die Datei sieht in etwa so aus:
Java:
66
11
467	191
467	191
467	191
467	191
467	191
467	191
467	191
467	191
467	191
467	191
467	191
212
547	152
547	152
547	152
547	152
547	152
547	152
......
Die erste Zahl gibt die Anzahl der Polygonzüge an, also 66, die zweite die Anzahl der Punkte beim ersten Zug, dann kommen die 11 Punkte, die nächste Zahl sind die Gesamtpunkte beim nächsten Poygonzug, dann kommen die 212 Punkte usw. Diese Koordinaten habe ich in ein pointArray[][] gespeichert und dort ist auch alles richtig (bin das mal mit ner Schleife durchgegangen).

Wenn ich nun zeichnen lassen will, hole ich mir einzeln die Point-Werte und speichere sie in int[] x, int[] y Arrays, um sie der Methode drawPoygon(int[] x, int[]y, int n) zu übergeben. Das sieht dann wie folgt aus:

Java:
public void paint(Graphics g) {
		super.paint(g);
		// Schreibt die Werte aus dem Point-Array in int-Arrays und zeichnet dann nacheinander die Polygonzüge
		for(int l = 0; l < pointArray.length; l++) {
			int[] x = new int[pointArray[l].length];
			int[] y = new int[pointArray[l].length];
			for(int i = 0; i < pointArray[l].length; i++) {
				x[i] = (int) pointArray[l][i].getX();
				y[i] = (int) pointArray[l][i].getY();
				//System.out.println(x[i] + " / " + y[i]);
			}
			g.drawPolygon(x,y,pointArray[l].length);
		}
	}

Jeds mal wenn ich jetzt die Klasse ausführe erhalte ich bei [JAVA=5]int[] x = new int[pointArray[l].length];[/code] einen NullPointerExeption, weiß aber nicht wieso, da das Bild ja auch korrekt gezeichnet wird. Wenn ich die Kommentare von [JAVA=10]//System.out.println(x + " / " + y);[/code] wegnehme, funktioniert alles wunderbar. Dies kann ich mir nicht erklären.

Hat jemand eine Ahnung woran es liegen könnte?

Grüße
 
Zuletzt bearbeitet von einem Moderator:
S

SlaterB

Gast
die Exception kommt genau deswegen, weil pointArray[l] für irgendein l null ist, einfacher gehts nicht,

deine Ausgaben usw. sind skeptisch zu betrachten, könnten sich auf ein kleines l oder einen vorherigen Durchlauf
der Methode beziehen, wo zufällig manches klappt,

oder du bekommst so viele Ausgaben, dass du die Exceptions gar nicht siehst,
wenn ein paint abgebrochen wird, ist das Programm nicht gleich zu Ende,
vielleicht funktionieren spätere Mal-Vorgänge und ersetzen die alte Ausgabe der Exception

------

gib einfach zu Beginn der Methode die Länge des pointArray aus und in einer Schleife alle Objekte untereinander,
schon siehst du glasklar, ob ein Element im Array null ist oder nicht,
NullPointerExeption sind so leicht zu behandeln..

wenn es natürlich wieder viele paint-Aufrufe gibt, droht auch diese Information verdrängt zu werden


warum im Array nicht alles gesetzt ist kann man bisher nicht erkennen, hängt von anderen Code ab
 

Pauli85

Mitglied
die Exception kommt genau deswegen, weil pointArray[l] für irgendein l null ist, einfacher gehts nicht,
....
gib einfach zu Beginn der Methode die Länge des pointArray aus und in einer Schleife alle Objekte untereinander,
schon siehst du glasklar, ob ein Element im Array null ist oder nicht,
NullPointerExeption sind so leicht zu behandeln..
...

Ich hab alle Einträge schon mal auf null überprüft und auch pointArray[l], aber alles war so wie es sein soll. Dies habe ich allerdings außerhalb meiner paint(Graphics g) Methode gemacht (pointArray[][] ist Objektvariable). Wie gesagt, alles ohne Fehler.
Wenn ich aber die selbe Überprüfung in der Methode paint(Graphics g) mache, bekomme ich die Exeption. Wie kann das sein?

Hier mal mein Code:
Java:
import java.awt.Graphics;
import java.awt.Point;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;

import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class Drawing extends JFrame {
	
	private Point[][] pointArray; // Array in dem alle Punkte gespeichert werden

	Drawing() { // Erzeugung des Fensters
		setSize(500,500);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setVisible(true);
	}
		
	public void load(File datei) {
		try {
			// input ließt alle Werte aus dem Dokument
			BufferedReader input = new BufferedReader(new InputStreamReader(new FileInputStream(datei)));
			int numberOfPoly = Integer.parseInt(input.readLine());		
			pointArray = new Point[numberOfPoly][]; 
			// Schreibt alle Werte aus der Datei in das Array als x,y-Koordinaten (Point)
			for(int l = 0; l < numberOfPoly; l++) {	
				int numberOfPoints = Integer.parseInt(input.readLine());	
				Point[] points = new Point[numberOfPoints];
				for(int i = 0; i < numberOfPoints; i++) {
					String line = input.readLine();
					String[] lineArray = line.split("\t");
					points[i] = new Point(Integer.parseInt(lineArray[0]),Integer.parseInt(lineArray[1]));
				}
				pointArray[l] = points;
			}			

//		//Zum testen
//		for(int i = 0; i < pointArray.length; i++) {
//				for(int l = 0; l < pointArray[0].length; l++) {
//					System.out.println(pointArray[i][l].getX() +" / " + pointArray[i][l].getY());	
//				}
//			}
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}  catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public void paint(Graphics g) {
		super.paint(g);
		g.translate(50,50);
		// Schreibt die Werte aus dem Point-Array in int-Arrays und zeichnet dann nacheinander die Polygonzüge
		for(int l = 0; l < pointArray.length; l++) {
			//System.out.println(l +": " +pointArray[l].length); //Test
			int[] x = new int[pointArray[l].length];
			int[] y = new int[pointArray[l].length];
			for(int i = 0; i < pointArray[l].length; i++) {
				x[i] = (int) pointArray[l][i].getX();
				y[i] = (int) pointArray[l][i].getY();
				//System.out.println(x[i] + " / " + y[i]);  //Test
			}
			g.drawPolygon(x,y,pointArray[l].length);
		}
	}
}

Hier ist auch noch die Datei mit den Koordinaten falls es jemanden interessiert:
https://www.dropbox.com/s/col58k5rm3kish3/de0.pol
 
S

SlaterB

Gast
eine einzelne Datei kann keine Aussage über ein Programm treffen,
vielleicht gibt es zwei Drawing-Objekte, in einem wird das Array initialisiert, im anderen paint() ausgeführt..

füge in den Konstruktor eine Ausgabe ein um zu erkennen, ob mehrere erstellt werden
 

Pauli85

Mitglied
Ne, wird nur ein Drawing Objekt erstellt.
Ich habe gerade gemerkt, dass wenn ich das Fenster vergrößere oder verkleinere die Zeichnung neu angefertigt wird. Wenn ich die jeweilige Größe des Arrays, also rowArray.length mitausgeben lasse, dann bekomm ich meistens beim 28. Eintrag die Exeption. Wenn ich aber nun die Größe des Fensters verändere und das Bild neu gezeichnet wird, dann läuft meine Ausgabe ohne Fehler bis zum Schluss durch. Also nur beim ersten Zeichenvorgang wird irgendwo eine null erkannt, danach ist dieses null plötzlich weg.

Grüße
 

bERt0r

Top Contributor
Wann rufst du denn deine load Methode auf? Dein pointArray wird nicht initialisiert. Nachdem du in deinem Konstruktor ein setVisible(true) drin hast, versucht dein Drawing Objekt gleich mal ein paintComponent, obwohl pointArray noch nicht initialisiert ist. Entweder du gibst das load in den konstruktor oder löschst das setVisible raus und machst es nachdem erfolgreich geladen wurde.
Eine andere möglichkeit wäre im paintComponent pointArray==null abzufragen...
 

Pauli85

Mitglied
Genau daran habe ich nicht gedacht, dass paint() ja schon automatisch zu beginn ausgeführt wird. Jetzt habe ich das setVisible(true) in die load-Methode gepackt, danke!

Ich habe noch eine kleine Frage. Kannst du mir vielleicht sagen wie ich meinem Fenster bzw. dem Zeichenbereich noch einen JScrollPane hinzufüge? Hier noch mal mein Code:

Java:
public class Drawing extends JFrame {

	private Point[][] pointArray; // Array in dem alle Punkte gespeichert werden
	
	public Drawing() { // Erzeugung des Fensters
		setSize(600,600);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setVisible(false);
	}
	
	public void load(File datei) {
		try {
			// input ließt alle Werte aus dem Dokument
			BufferedReader input = new BufferedReader(new InputStreamReader(new FileInputStream(datei)));
			int numberOfPoly = Integer.parseInt(input.readLine());		
			pointArray = new Point[numberOfPoly][]; 
			// Schreibt alle Werte aus der Datei in das Array als x,y-Koordinaten (Point)
			for(int l = 0; l < numberOfPoly; l++) {	
				int numberOfPoints = Integer.parseInt(input.readLine());	
				Point[] points = new Point[numberOfPoints];
				for(int i = 0; i < numberOfPoints; i++) {
					String line = input.readLine();
					String[] lineArray = line.split("\t");
					points[i] = new Point(Integer.parseInt(lineArray[0]),Integer.parseInt(lineArray[1]));
				}
				pointArray[l] = points;
			}						
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}  catch (IOException e) {
			e.printStackTrace();
		}
		this.setVisible(true);
	}
	
	public void paint(Graphics g) {		
		super.paint(g);
		g.translate(30,30);
		for(int i = 0; i < pointArray.length; i++) { 
			for(int l = 0; l < pointArray[i].length-1; l++) {
				g.fillRect((int)pointArray[i][l].getX(), (int)pointArray[i][l].getY(), 3, 3);
				g.drawLine((int)pointArray[i][l].getX(), (int)pointArray[i][l].getY(), (int)pointArray[i][l+1].getX(), (int)pointArray[i][l+1].getY());
			}
		}
	}
}

Grüße
 

bERt0r

Top Contributor
Das geht mit deiner Struktur nicht so leicht. Ich mache z.B immer den Frame in einer eigenen "MainFrame" Klasse, welche nur die Komponenten anordnet. Wenn du jetzt spezielle Komponenten mit eigenen Funktionalitäten hast, wie dein Drawing teil, realisiere ich das als JPanel oder JComponent. Das kannst du dann bequem in ein Scrollpane packen.
 

California

Aktives Mitglied
Leite Drawing statt von JFrame von JPanel ab.
Mach eine MainFrame Klasse extends JFrame.
Setze dort die ContentPane auf eineJScrollPane, die wiederum deine Drawing- Klasse enthält:

Java:
public class MainFrame extends JFrame {

main () {
   new MainFrame.setVisible( true );
}

public MainFrame() {
      JscrollPane scrollPane = new JScrollPane( new Drawing() );
      setContentPane( scrollPane );
... // Scroll- Policy setzen...
// sonstiger FrameSchmus mit defaultCloseOperation und LookAndFeel usw...
}

Code ist symbolisch und dient nur zur Erläuterung des Prinzips.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P NullPointerExeption mit JLabeln Allgemeine Java-Themen 10
N Java NullPointerExeption Allgemeine Java-Themen 5
J NullPointerExeption bei Inizialisierung eines Arrays Allgemeine Java-Themen 3
J Warum Stackoverflow oder Nullpointerexeption? Allgemeine Java-Themen 4
Fynn29 Liste sortieren ohne Array und ohne vorgegebene Sortierung Allgemeine Java-Themen 24
LucasGlockner Effizienter byte-Zugriff auf ein long[]-Array Allgemeine Java-Themen 8
8u3631984 Frage Performance bei Linked List und Array List Allgemeine Java-Themen 5
M Queue mit einem Array implemetieren Allgemeine Java-Themen 16
M Array Rang eines Elements Allgemeine Java-Themen 4
TheSepp Java bestimmtes Array auf den Wert 0 setzen Allgemeine Java-Themen 32
TheSepp Wie kann man Leerzeichen aus einer Array liste entfernen? Allgemeine Java-Themen 10
B HeapSort für Array of Strings funktioniert nur teilweise Allgemeine Java-Themen 3
noah1407 Array Allgemeine Java-Themen 3
D Methoden Teil-Array mit Maximalwert bestimmen Allgemeine Java-Themen 23
N einem Array Objekte hinzufügen die ihr Array position gespeichert haben Allgemeine Java-Themen 34
N zweidimensionalen Array in dreidimensionalen Array speichern Allgemeine Java-Themen 4
N Schnellste Methode, ein Array durchzugehen? Allgemeine Java-Themen 9
T Objekt Array Aufgabe mit Busdatenbank Allgemeine Java-Themen 2
L Array und Index Allgemeine Java-Themen 26
L die 3 größten Zahlen im Array Allgemeine Java-Themen 1
G jToggleButton in Array/ArrayList Allgemeine Java-Themen 12
S Übergabe eines Sortierkriteriums für ein Artikel Array mittels BiPredicate<Artikel, Artikel> Allgemeine Java-Themen 13
Willi.We Array sortieren Allgemeine Java-Themen 5
gotzi242 Array Summe bestimmen tipps? Allgemeine Java-Themen 14
H Matrix ohne Array erstellen Allgemeine Java-Themen 9
Aboya Char Array rekursiv vergleichen Allgemeine Java-Themen 15
V4ll3.Wff Array in Java Allgemeine Java-Themen 4
Noahscript Aus einem byte Array Steuerungszeichen und Code bekommen und ersetzen Allgemeine Java-Themen 3
H Array Sportschütze Allgemeine Java-Themen 6
Sumo_ow "ArrayIndexOutofBoundsException: 2" Array Problem Allgemeine Java-Themen 6
xGh0st2014 Problem mit Java Array Allgemeine Java-Themen 1
M Array verändern Allgemeine Java-Themen 1
A JavaFX 2 dimensionales array Allgemeine Java-Themen 1
LimDul Direktes return eines Array geht nicht Allgemeine Java-Themen 20
S Array dynamisieren oder ArrayList verwenden? Allgemeine Java-Themen 17
M Java 2D Array für ein Grid erstellen ? Allgemeine Java-Themen 2
H Array mit dem Datentype String[] initializieren Allgemeine Java-Themen 7
L ArrayList mit String Arrays in ein Array umwandeln Allgemeine Java-Themen 1
H Elemente aus ArrayList in Array speichern Allgemeine Java-Themen 8
E Datentypen Wie kann ich die Längen der unterschiedlichen Ebenen aus einem Objekt lesen von dem ich weiß, dass es ein mehrdimensionaler Array ist? Allgemeine Java-Themen 3
N Byte Array in Java "dekomprimieren" Allgemeine Java-Themen 3
parrot Array Aufgabe Allgemeine Java-Themen 3
N String Array Eingabe Allgemeine Java-Themen 6
R Warum wird mir in der Konsole das "Standard Array" ausgegeben? Allgemeine Java-Themen 2
N Variablen Array Länge ändern. Allgemeine Java-Themen 8
D Kgv aller Paare aus einem Array mit n integer berechnen Allgemeine Java-Themen 5
W Enumeration ein Array/List als Eigenschaft mitgeben - warum geht das nicht? Allgemeine Java-Themen 0
kodela Problem mit strukturiertem Array Allgemeine Java-Themen 18
A Array Problem Allgemeine Java-Themen 8
Drachenbauer Wie stelle ich fest, ob ein Objekt in meinem Array vorkommt? Allgemeine Java-Themen 5
F Datei in String-Array einlesen Allgemeine Java-Themen 8
L Objekt aus Objekt-array "löschen" Allgemeine Java-Themen 2
I Array Parameter mit 2 Klassen - NullPointerException Allgemeine Java-Themen 3
X Größten Werte in meinem Array löschen? Allgemeine Java-Themen 16
E Angabe wie groß Array sein soll und in for-schleifen diesen Array füllen Allgemeine Java-Themen 3
F 3 Dimensionales Array mit Allgemeine Java-Themen 9
M Steueralgorithmus verwandelt Array in Anfangszustand Allgemeine Java-Themen 9
W Array vs. ArrayList vs. HashMap Allgemeine Java-Themen 20
D Datentypen 2-3 Baum erstellen mit geordnetem int-array Allgemeine Java-Themen 0
T Objekt in Array packen Allgemeine Java-Themen 6
M Zahlen in Array anordnen Allgemeine Java-Themen 8
M Eclipse Unvollständigen Array ansteuern Allgemeine Java-Themen 2
D Erste Schritte Im Array Werte tauschen Allgemeine Java-Themen 5
Xge For/Array Error: IndexOutOfBounds Allgemeine Java-Themen 4
M Wie kann ich ein int[] Array in einer Methode benutzen? Allgemeine Java-Themen 6
FRI3ND Datentypen Date-Array sortieren - Text mitnehmen? Allgemeine Java-Themen 7
D Integer-Array variabler Größe mit Zahlen befüllen (Schleifen) Allgemeine Java-Themen 0
J Variablen Array ertellen bei model.put Allgemeine Java-Themen 13
S Eindimensionales Array in zweidimensionales Array speichern Allgemeine Java-Themen 5
R convert 2d array list to 2d array Allgemeine Java-Themen 1
J json Array würfel Spalten durcheinander Allgemeine Java-Themen 9
MiMa Array umbau oder Alternative? Allgemeine Java-Themen 5
L Datentypen 3D Array Allgemeine Java-Themen 3
M 2D Array mit unterschiedlichen Längen erstellen und befüllen Allgemeine Java-Themen 11
Mario1409 Methoden JSON Array von URL Allgemeine Java-Themen 8
E Swing Array mit Bildern in GUI darstellen Allgemeine Java-Themen 2
P Array einer abstrakten Klasse Allgemeine Java-Themen 4
H Zweidimensionales Array - Zellen der Tabelle verbinden Allgemeine Java-Themen 2
M Zweidimensionales Array mit Binärzahlen füllen Allgemeine Java-Themen 8
M Array aus Thread Objekten erstellen Allgemeine Java-Themen 2
kodela Dynamisches Array in einer Klasse Allgemeine Java-Themen 5
G Array ohne Aufzählungszeichen ausgeben Allgemeine Java-Themen 6
J Wie kann ich ein Java Array als Säulendiagramm ausgeben? Allgemeine Java-Themen 2
Z 2D Array Pixels reparieren Allgemeine Java-Themen 2
S Algorithmus welcher True-Werte in einem Array findet und auswertet. Allgemeine Java-Themen 5
B Polibios Array erweitern Allgemeine Java-Themen 1
R Index in einem Array löschen Allgemeine Java-Themen 10
R Index in einem Array löschen Allgemeine Java-Themen 2
U Methoden Algorithmus MergeSort String [ ] array sortieren programmieren Allgemeine Java-Themen 17
J Array-List Bubble-Sort Allgemeine Java-Themen 12
4 Variablen Int-Array Int Zuweisen Allgemeine Java-Themen 7
J Array Allgemeine Java-Themen 8
Z Array mit unterschiedlichen Werten Allgemeine Java-Themen 1
L sortiertes Array im main aufrufen klappt nicht. Allgemeine Java-Themen 3
O Mein JButton Array funktioniert nicht Allgemeine Java-Themen 3
A Mit dem letzten bis zum ersten Wert aus Array rechnen Allgemeine Java-Themen 15
A Vector Strings in Array splitten Allgemeine Java-Themen 6
I Muster in Array suchen Allgemeine Java-Themen 10
RalleYTN Datentypen Herausfinden ob Object ein Array ist ohne den Typen des Arrays zu kennen? Allgemeine Java-Themen 12
S Variablen String[] Array per schleife in int[] einlesen Allgemeine Java-Themen 8

Ähnliche Java Themen

Neue Themen


Oben