2016-11-18 3 views
0

У меня возникли проблемы с тем, как создавать двухмерные массивы объектов. Я попытался продемонстрировать ниже небольшой образец, чтобы воспроизвести ошибку, которую я получаю.Как правильно создать двумерный массив в Java

У меня есть этот класс с именем Узел, который в основном хранит один символ. Этот класс используется внутри класса с именем Test как двухмерный атрибут. Я использовал пользовательский ввод, чтобы установить размер массива и создать его экземпляр внутри метода instantiate(). Затем, используя метод набора, я пытаюсь заполнить карту . Однако компилятор дает мне следующее сообщение об ошибке:

консоли Eclipse Вывод:

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

Мой вход был:

Enter height: 3 Enter width: 3

Ниже приведен код, я использую, чтобы воспроизвести эту ошибку:

Класс Node:

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; 
    } 
} 

Класс Тест:

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; 
    } 

} 

Основной метод:

public class Main { 

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

код также можно увидеть здесь: http://pastebin.com/agFMmB38
Я все еще привыкаю к ​​Java (наступающем от C++), так что они имеют некоторые различия, которые я еще не мог понять.

Любая помощь была бы принята с благодарностью. Спасибо!

ответ

1

map[i][j] должен быть установлен на новый объект, как map[i][j] = new Node('a') (ну, если у вас есть конструктор в Node, который работал так: это было бы написано Node(char a) { this.content = a; }).

Вы не можете сделать map[i][j].setContent('a'), так как он не является существующим Node объектом.

+1

Это сработало! Большое вам спасибо, я боролся с этим в течение нескольких часов, и это было очень просто. – leandrocoutom

+0

Всегда рад помочь! – ifly6

0

Перед использованием метода setContent (char c) вам необходимо инициализировать объект узла.

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'); 
     } 
    } 
} 

Затем используйте метод getContent(), чтобы получить значение, которое вы хотите.

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(); 
    } 
} 
Смежные вопросы