我遇到了如何实例化二维对象数组的问题。我试图在下面演示一个小样本来重现我得到的错误。
我有一个名为 Node 的类,它基本上存储一个字符。此类在名为 Test 的类中用作双维属性。我使用了一些用户输入来确定数组的大小,并在instantiate()方法中实例化它。然后,我尝试使用set方法填充 map 。但是,编译器给出了以下错误消息:
Eclipse控制台输出:
线程“main”java.lang.NullPointerException中的异常 在Test.populate(Main.java:44) 在Main.main(Main.java:77)
我的意见是:
输入身高: 3 输入宽度: 3
以下是我用来重现此错误的代码:
班级节点:
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 ++),所以他们有一些我无法弄清楚的差异。
非常感谢任何帮助。 谢谢!
答案 0 :(得分:1)
map[i][j]
需要设置为一个新对象,例如map[i][j] = new Node('a')
(好吧,如果你在Node
中有一个像这样工作的构造函数:它会写成{{1} })。
您不能Node(char a) { this.content = a; }
,因为它不是预先存在的map[i][j].setContent('a')
对象。
答案 1 :(得分:0)
您需要在使用setContent(char c)方法之前初始化Node对象。
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();
}
}