如何在Java

时间:2016-11-18 04:15:40

标签: java arrays object

我遇到了如何实例化二维对象数组的问题。我试图在下面演示一个小样本来重现我得到的错误。

我有一个名为 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 ++),所以他们有一些我无法弄清楚的差异。

非常感谢任何帮助。 谢谢!

2 个答案:

答案 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();
    }   
}