所以,我最近从C ++(由于我的教育)转向Java并做了一些练习。我相信这个问题不是很聪明,但我真的需要知道我做错了什么。
简单地说,我有3个班级:
我的问题出在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();
}
}
对不起,如果我没有提到任何重要的事情。您可以问我这个问题,我很乐意添加一些新信息。
答案 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
数组的项目。