用Java填充对象数组

时间:2014-02-15 09:27:42

标签: java arrays

所以,我最近从C ++(由于我的教育)转向Java并做了一些练习。我相信这个问题不是很聪明,但我真的需要知道我做错了什么。

简单地说,我有3个班级:

  • mainClass
  • 作曲
  • 音乐会

我的问题出在main():

public static void main(String[] args) {
    Composer Schubert = new Composer("Franz Schubert", "Classical Music", 6);
    Schubert.getConcert()[1].enterWholeConcertData(); //program just crashes here
}

之后没有任何事情发生,只是抛出了这个异常:

  

线程“main”中的异常java.lang.NullPointerException at   incredible_package.mainClass.main(mainClass.java:16)

注意:如果我直接从Concert类对象调用enterWholeConcertData()并且它不是它们的数组(如下所示),一切正常:

Concert concert = new Concert();
concert.enterWholeConcertData();

Composer 有一个字段,它是一个的Concert 类数组和一个int变量,它定义了Concert类中的元素数量(加上默认构造函数,另一个setters / getters,“show fields”方法,“输入整个信息”方法):

public class Composer{
        Composer(String name, String genre, int aNOC)
    {
        this.name = name;
        this.genre = genre;
        this.numberOfConcerts = aNOC;

        this.concert = new Concert[numberOfConcerts];
    }

    private int amountOfSpectators;
    private Concert[] concert;
}
Composer类中的Concert的

Getter

public Concert[] getConcert()
    {
        Concert[] copy = new Concert[this.concert.length];
        System.arraycopy(this.concert, 0, copy, 0, copy.length);
        return copy;
    }        

音乐会包括(加上setter / getters,“show info”方法,参数构造函数):

public class Concert{
    Concert()
    {
        date = "--.--.----";
        amountOfSpectators = 0;
    }

    private String date;
    private int amountOfSpectators;

    public void enterWholeConcertData()
        {
            System.out.println("Enter the date:");

            Scanner sDate = new Scanner(System.in);
            date = sDate.nextLine();
            sDate.close();

            System.out.println("Enter the number of spectators: "
                    + "");

            Scanner sAOW = new Scanner(System.in);
            amountOfSpectators = sAOW.nextInt();
            sAOW.close();
        }
}

对不起,如果我没有提到任何重要的事情。您可以问我这个问题,我很乐意添加一些新信息。

2 个答案:

答案 0 :(得分:3)

从我看到的内容:

public static void main(String[] args) {
    Composer Schubert = new Composer("Franz Schubert", "Classical Music", 6);
    Schubert.get_concert()[1].enterWholeConcertData(); //program just crashes here
}

您创建一个新的Compser,设置其名称,流派和NoC。 您还初始化了6个元素的数组。

但是,数组中的元素或Null,因为您尚未初始化它们。 你应该至少做过类似的事情:

Shuber.get_concert()[1] = new Concert();

在调用方法之前,对任何其他项目都一样。

答案 1 :(得分:0)

您没有初始化Composer.concert数组的任何单个项目。在这种情况下,Composer.concert数组的每个项目都将初始化为null,这就是您获得NullPointerException的原因。

引用JLS部分4.12.5

  

每个数组组件都使用默认值进行初始化   创建了

     

对于所有引用类型,默认值为null

您应该自己初始化Composer.concert数组的项目。