尽管我正确地初始化了所有对象(据我所知),但我得到了一个空指针异常。但是,我需要有人指出我曾经是个白痴。
运行时NPE出现在这里:
public class CDAlbum implements Album{
private String title;
private String genre;
private String artist;
private ArrayList<String> tracks;
private int i=0;
public CDAlbum() { //constuctor
title = "Unknown CD";
genre = "Unknown genre";
artist = "Unknown artist";
ArrayList<String> tracks = new ArrayList<String>(); //NPE occurs on this line
tracks.add("-- no tracks --");
}
//snip
调用构造函数的代码:
CDAlbum tempCD;
tempCD = new CDAlbum();
我认为我正在初始化所有内容,因此我无法看到此空指针异常的来源。一点帮助?
答案 0 :(得分:2)
事实证明,您的问题是因为您忘记重新编译代码!从您的保管箱下载代码后,我反编译CDAlbum
以显示过时的构造函数:
public CDAlbum() {
i = 0;
title = "Unknown CD";
genre = "Unknown genre";
artist = "Unknown artist";
tracks.add("-- no tracks --");
}
重新编译后(遵循我的建议),代码似乎工作正常。
正如我在my comments中所述,您的代码可能已修改,不生成异常的实际代码;您很可能尝试添加到tracks
字段,但您从未对其进行初始化 - 您仅初始化了本地变量tracks
。
尝试执行以下操作......
tracks = new ArrayList<>(Collections.singleton("-- no tracks --"));
您应该发布SSCCE或至少未修改的代码以获得准确的帮助。如果你把它当作黑盒子来解决这个问题就很难了。
请注意,您可以将所有初始化移至字段声明,例如
private String title = "Unknown CD";
答案 1 :(得分:1)
该行
ArrayList<String> tracks = new ArrayList<String>();
应该是
tracks = new ArrayList<String>();
当你不应该在你上面的课堂范围内声明它时,你会重新声明它
private ArrayList<String> tracks;