Dynamisches Array in einer Klasse

kodela

Bekanntes Mitglied
Hallo,

ich habe mit folgendem Code ein Problem:
Java:
package test;

public class TEST
{
    static STR8T str = new STR8T(4);
  
    private static void setTest(int len, int i, int z, int s) {
        str.len = len;
        str.pos[i].z = z;
        str.pos[i].s = s;
    }  
    static private class ZPOS {
        int z;
        int s;
        public ZPOS() {
            z = -1;
            s = -1;
        }
    }
    static private class STR8T {
        ZPOS[] pos;
        int len;
        boolean geloest;
        public STR8T(int zellen) {
            for (int i = 0; i < zellen; i++) {
                pos[i] = new ZPOS();     // NullPointerException für diese Zeile
            }
            len = 0;
            geloest = false;
        }
    }      
    public static void main(String[] args) {     
        setTest(3, 2, 8, 5);
    }
}
Mit diesem Codeschnipsel will ich die Klasse STR8T testen. Sie soll für ein Str8ts-Rätsel alle entscheidenden Informationen für eine Straße liefern. Dazu zählen mit dem ZPOS-Array auch die Positionen der einzelnen Zellen.

Zur Zeit verwende ich dazu in der Klasse STR8T nur zwei ZPOS-Objekte für die jeweils erste und letzte Zelle einer Straße. Das funktioniert sehr gut, hat aber den Nachteil, dass die Positionen der dazwischen liegenden Zellen jeweils neu berechnet werden müssen. Dies möchte ich gerne über ein dynamisches Array für die Positionen vermeiden. Leider bekomme ich aber hier im Konstruktor eine NullPointerException.

Kann mir bitte jemand sagen, was ich an meinem Code ändern muss, damit es nicht zu dieser NullPointerException kommt?

MfG, kodela
 
Der Grund für die NPE ist, dass du das pos Array zwar deklariert, allerdings niemals initialisiert hast.

Java:
static private class STR8T {

        ZPOS[] pos;
        int len = 0;
        boolean geloest = false;

        public STR8T(int zellen) {
           
            pos = new ZPOS[zellen];  // Initialisierung!!!
            for (int i = 0; i < zellen; i++) {
                pos[i] = new ZPOS();    
            }
        }
    }
 
Der Grund für die NPE ist, dass du das pos Array zwar deklariert, allerdings niemals initialisiert hast.
Wird das pos Array nicht für jedes neue STR8T Objekt in dessen Konstruktor initialisiert? Da mache ich wohl einen Denkfehler. Wie müsste ich es denn richtig machen?

Übrigens ist mein Titel zu diesem Thema Quatsch. Das ZPOS Array soll nur für jedes STR8T Objekt mit einer individuellen Größe initialisiert und dann nicht mehr in seiner Größe verändert werden. Da ist also nichts dynamisch.
 
Mit folgendem Code kann ich nun für für jedes Str8t-Objekt ein Array mit der Länge der Str8t für die Positionsangaben der einzelnen Zellen generieren:
Java:
class Test
{
    public void testen() {
        Str8t str = new Str8t(4);   
        str.setPos(0,3,6);
        str.setPos(1,3,7);
        str.setPos(2,3,8);
        str.setPos(3,3,9);               
    }
   
    public class Str8t {
        int len;
        int index;
        boolean isZeile;
        boolean geloest;
        Position[] pos;

        public class Position {
            int z;
            int s;
            public Position() {
                z = -1;
                s = -1;
            }
        }

        public Str8t(int laenge) {
            len = laenge;
            index = 0;
            isZeile = false;
            geloest = false;
            pos = new Position[len];
            for (int i = 0; i < len; i++) {
                pos[i] = new Position();    // keine NPE für diese Zeile mehr
            }
        }

        void setPos(int i, int z, int s) {
            pos[i].z = z;
            pos[i].s = s;
        }
    }       
}

public class MeinTestprogramm {
    static Test tst = new Test();
    public static void main(String[] args) {  
        tst.testen();
    }
}
 

Neue Themen


Zurück
Oben