2016-11-18 4 views
0

Ich habe Probleme, bi-dimensionales Array von Objekten zu instanziieren. Ich habe versucht, unter einer kleinen Probe zu demonstrieren, um den Fehler zu reproduzieren, den ich bekomme.Wie man ein zweidimensionales Array in Java richtig instanziiert

Ich habe diese Klasse mit dem Namen Knoten, die grundsätzlich ein Zeichen speichert. Diese Klasse wird innerhalb der Klasse Test als zweidimensionales Attribut verwendet. Ich habe einige Benutzereingaben verwendet, um die Größe des Arrays zu ermitteln und es in der instanziate() -Methode zu instanziieren. Dann versuche ich, die Karte mit einer Set-Methode zu bevölkern. Allerdings gibt der Compiler mir die folgende Fehlermeldung:

Eclipse-Console Output:

Exception in thread "main" java.lang.NullPointerException at Test.populate(Main.java:44) at Main.main(Main.java:77)

Meine Eingabe war:

Enter height: 3 Enter width: 3

Unten ist der Code ich diesen Fehler zu reproduzieren bin mit:

Knoten

Klasse:

class Node { 
    private char content; 

    Node(){ 
     this.content = ' '; 
    } 

    Node(Node node){ 
     this.content = node.getContent(); 
    } 

    //Setter 
    public void setContent(char c) { 
     this.content = c; 
    } 

    //Getter 
    public char getContent() { 
     return this.content; 
    } 
} 

Klasse Test:

class Test { 
    private Node[][] map; 
    private int height, width; 

    public void instantiate(){ 
     Scanner reader = new Scanner(System.in); 
     System.out.println("Enter height: "); 
     this.height = reader.nextInt(); 
     System.out.println("Enter width: "); 
     this.width = reader.nextInt(); 
     map = new Node[height][width]; 
     reader.close(); 
    } 

    public void populate(){ 
     for(int i=0;i<height;i++) 
      for(int j=0;j<width;j++){ 
       if((i+j) %2 == 0) 
        map[i][j].setContent('a'); 
       else 
        map[i][j].setContent('b'); 
      } 
     /* 
     * a b a b 
     * b a b a ... 
     * a b a b 
     * b a b a 
     * . . . 
     */ 
    } 

    public void print(){ 
     for(int i=0;i<height;i++){ 
      for(int j=0;j<width;j++){ 
       System.out.print(map[i][j].getContent()); 
      } 
     System.out.println(); 
     } 
    } 

    public Node[][] getMap(){ 
     return this.map; 
    } 

} 

Main-Methode:

public class Main { 

    public static void main(String[] args) { 
     Test testing = new Test(); 
     testing.instantiate(); 
     testing.populate(); 
     testing.print(); 
    } 
} 

Der Code kann auch hier gesehen werden: http://pastebin.com/agFMmB38
ich noch immer auf Java (aus Richtung C++) verwendet werden, so dass sie einige Unterschiede, die ich noch nicht herausfinden konnte.

Jede Hilfe würde sehr geschätzt werden. Vielen Dank!

Antwort

1

map[i][j] muss auf ein neues Objekt festgelegt werden, wie map[i][j] = new Node('a') (gut, wenn Sie einen Konstruktor in Node, die so gearbeitet haben: es Node(char a) { this.content = a; } geschrieben werden würde).

Sie können map[i][j].setContent('a') nicht tun, da es kein bereits vorhandenes Node Objekt ist.

+1

Es hat funktioniert! Vielen Dank, ich habe ein paar Stunden damit zu kämpfen und es war wirklich einfach. – leandrocoutom

+0

Immer glücklich zu helfen! – ifly6

0

Sie müssen ein Node-Objekt initialisieren, bevor Sie die Methode setContent (char c) verwenden.

public void populate() { 
    for(int i=0;i<height;i++) { 
     for(int j=0;j<width;j++) { 
      map[i][j] = new Node(); 
      if((i+j) %2 == 0) 
       map[i][j].setContent('a'); 
      else 
       map[i][j].setContent('b'); 
     } 
    } 
} 

Verwenden Sie dann die Methode getContent(), um den gewünschten Wert abzurufen.

public void print() { 
    for(int i=0;i<height;i++) { 
     for(int j=0;j<width;j++) { 
      System.out.print(map[i][j].getContent()); 
     } 
     System.out.println(); 
    } 
} 
Verwandte Themen