Array Ausgabe NullPointerException

FX12

Mitglied
Tach zusammen,

bin gerade dabei ein kleines Programm zu schreiben, welches mir zweidimensionalen Arrays arbeiten soll. Nur ist mein Problem, dass ich noch nicht mal die Ausgabe meines Arrays hinbekomme. Liegt der Fehler im Konstruktor?
Ist eine NullpointerException und liegt warscheinlich daran, dass ich im Konstruktor erstmal ein Objekt erstellen sollte... aber keine Ahnung wie..
Danke


Java:
public class PolygonArray {

    private Point[][] p;

    public PolygonArray(Point[][] p) {

        if (p == null) {
            System.err.println("Fehler");

        } else {
           
            for (int i = 0; i < p.length; i++) {     
                for (int j = 0; j < p[i].length; j++) {
                    this.p[i][j] = p[i][j];
                }
            }
        }
    }

    public void printArray() {
        for (int i = 0; i < p.length; i++) {
            for (int j = 0; j < p[i].length; j++) {
                System.out.print(p[i][j] + "  ");
                System.out.println("");
            }
        }
    }

    public static void main(String[] args) {
        Point[][] t = {
            {new Point(5, 8), new Point(-4, 9), new Point(-12, -7)},
            {new Point(-1, 0), new Point(2, 0)},
            {new Point(6, -12), new Point(4, 9), new Point(-10, 9), new Point(14, 0)}
        };

        PolygonArray x = new PolygonArray(t);

        x.printArray();
    }
}
 
Nunja du versucht innerhalb der verschachtelten Schleife bei
Code:
this.p[i][j] = p[i][j];
der Klassenvariablen this.p einen Wert zuzuweisen, die Klassenvariable p ist allerdings noch nicht lauffähig da du nur eine Referenz darauf hast und noch kein Objekt.

Du musst die Klassenvariable this.p also erst noch initialisieren.
 
Vielen Dank schon einmal
Habe es mal versucht, aber es kommt immer noch die NullpointerException. Was mach ich denn noch falsch?


Hier mein "neuer" Code für den Konstruktor

Java:
public PolygonArray(Point[][] p) {

        if (p == null) {
            System.err.println("Fehler");

        } else {
            this.p=new Point[p.length][]; // das ist neu!!
            for (int i = 0; i < p.length; i++) {     
                for (int j = 0; j < p[i].length; j++) {
                    this.p[i][j] = p[i][j];
                }
            }
        }
        
    }
 
Zuletzt bearbeitet:
Du hast nun naja das halbe 2D Array initialisiert.

Mit folgender Zeile, sollte es Testweise gehen.

Java:
 this.p=new Point[5][5];
 
leider funktioniert es auch mit deinem Vorschlag nicht.
Hättest du noch andere?

Ps: Ich will, dass ich in der main-Methode jegliches 2DArray eingeben kann und danach mit diesem weitermachen kann. Deshalb mein Vorschlag mit
Java:
this.p=new Point[p.lenght][]

Ich habe mir auch schon Gedanken gemacht, wie ich die Anzahl der Spalten verallgemeinern kann und bin nur auf
Java:
 this.p=new Point[p.lenght][p[i].lenght]
gekommen, was aber auch nicht funktionert, da Variable "i" ja erst später auftaucht


achso.. die Ausgabe bei deinem Vorschlag ist:
Point@50a9ae05
Point@33dff3a2
Point@33f42b49
null
null
Point@6345e044
Point@86c347
null
null
null
Point@f7e6a96
Point@3487a5cc
Point@35960f05
Point@eb42cbf
null
null
null
null
null
null
null
null
null
null
null
 
Zuletzt bearbeitet:
Ich verstehe nicht genau, was Du im Konstruktor mit der Schleife machen willst. Du kannst doch das übergebene Point[] Deiner Instanzvariable zuweisen. Du willst ja hier nur das Array ausgeben lassen, oder vestehe ich grad was falsch? 😉

Also, mit folgendem Konstruktor geht bei mir die Ausgabe wuderbar:

Java:
public PolygonArray(Point[][] p) {

        if (p == null) {
            System.err.println("Fehler");

        } else {
            this.p = p;
        }
    }
 
funktioniert bei mir nicht trotzdem vielen Dank.
Oder verstehe ich diese Ausgabe nicht? Was bedeutet denn diese?

Point@33dff3a2
Point@33f42b49
Point@6345e044
Point@86c347
Point@f7e6a96
Point@3487a5cc
Point@35960f05
Point@eb42cbf
Point@56e5b723
 
Abgesehen davon ist der Konstruktor semantisch falsch.

Wenn ein ungültiges p übergeben wird sollte nicht stillschweigend eine kaputte Instanz erzeugt werden welche bei jedem Methodenaufruf auseianderfliegt sondern die Objekterzeugung mit einer Exception abbrechen.
 
funktioniert bei mir nicht trotzdem vielen Dank.
Oder verstehe ich diese Ausgabe nicht? Was bedeutet denn diese?
Das bedeutet Deine Ausgabe:
The toString method for class Object returns a string consisting of the name of the class of which the object is an instance, the at-sign character `@', and the unsigned hexadecimal representation of the hash code of the object

Ist das eine eigene Point-Klasse? Bei mir sieht die Ausgabe so aus:
java.awt.Point[x=5,y=8]
java.awt.Point[x=-4,y=9]
java.awt.Point[x=-12,y=-7]
java.awt.Point[x=-1,y=0]
java.awt.Point[x=2,y=0]
java.awt.Point[x=6,y=-12]
java.awt.Point[x=4,y=9]
java.awt.Point[x=-10,y=9]
java.awt.Point[x=14,y=0]
Bei einer eigenen Klasse musst Du die
Java:
toString()
-Methode überschreiben, bei awt.Point wurde sie wohl schon überschrieben.
 
würde gerne diesen code:

Point@33dff3a2
Point@33f42b49
Point@6345e044
Point@86c347
Point@f7e6a96
Point@3487a5cc
Point@35960f05
Point@eb42cbf
Point@56e5b723

in eine normale Form bekommen. Und wenn ich das richtig verstanden habe, ist dies ein hexacode?!
Oder liege ich da falsch?
 
Du musst nur die toString() Methode deiner Point Klasse überschreiben.
Aussehen könnte das so:
Java:
public class Point {
  private int x;
  private int y;

  [...]

  @Override
  public String toString () {
    return String.format ("Dies ist ein Punkt bei %s/%s", this.x, this.y);
  }
}
 
Vielen vielen Dank!!! Funktioniert super..

Jetzt habe ich noch ein Problem.. und zwar soll ich den Absolutbetrag meines Arrays "ausrechen". Gibts da irgendwie einen Trick oder muss ich mir jeden Wert mit der getter Methode holen und dann den Betrag bilden... und dann wieder ein PolygonArray daraus machen?
 

Zurück
Oben