java runtime NullPointerException尽管初始化

时间:2012-08-26 00:06:31

标签: java nullpointerexception

尽管我正确地初始化了所有对象(据我所知),但我得到了一个空指针异常。但是,我需要有人指出我曾经是个白痴。

运行时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();

我认为我正在初始化所有内容,因此我无法看到此空指针异常的来源。一点帮助?

2 个答案:

答案 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;