0

尽管正确初始化了我的所有对象(据我所知),但我得到了一个空指针异常。基本上,我需要有人指出我在哪里是个白痴。

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

我想我正在正确初始化所有内容,所以我看不到这个空指针异常来自哪里。一点帮助?

4

2 回答 2

2

事实证明,您的问题是因为您忘记重新编译代码!从您的保管箱下载代码后,我反编译CDAlbum以显示一个过时的构造函数:

public CDAlbum() {
  i = 0;
  title = "Unknown CD";
  genre = "Unknown genre";
  artist = "Unknown artist";
  tracks.add("-- no tracks --");
}

重新编译后(按照我的建议),代码似乎工作正常。


正如我在评论中所说,您的代码可能已被修改,而不是产生异常的实际代码;您很可能尝试添加到该tracks字段,但您从未初始化它 - 您初始化了局部变量tracks

尝试执行以下操作...

tracks = new ArrayList<>(Collections.singleton("-- no tracks --"));

您应该发布SSCCE或至少发布未修改的代码以获得准确的帮助。如果您将其视为黑匣子,将很难解决该问题。


请注意,您可以将所有初始化移动到字段声明,例如

private String title = "Unknown CD";
于 2012-08-26T00:17:31.330 回答
1

线

ArrayList<String> tracks = new ArrayList<String>();

应该

tracks = new ArrayList<String>();

你在不应该的时候重新声明它,因为你已经在上面的类范围内声明了它

private ArrayList<String> tracks;
于 2012-08-26T00:14:14.667 回答