2011-05-11 82 views
0

我试图运行一个程序,如果一切顺利,能够花一年时间并返回当年发布的专辑的标题。我已经给了它6张专辑,现在我正在试图打印一个标题。我修复了一些令人沮丧的错误,但这是我以前从未见过的错误。错误出现在第21行,但我不确定它的含义。谁能帮忙?“线程中的异常”main“java.lang.NullPointerException”

package songselector; 

import java.util.Scanner; 

public class Main { 
    public class Album 
    { 
int year; String title; 
public Album() { 
this.year = 0; this.title = null; 
     } 
public Album (int year, String title) { 
this.year = year; this.title = title; 
    } 
    } 

    class CAKE { 
Album[] albums; 
public CAKE() { 
albums = new Album[6]; 
albums[0].year = 1994; albums[0].title = "Motorcade Of Generosity"; 
albums[1].year = 1996; albums[1].title = "Fashion Nugget"; 
albums[2].year = 1998; albums[2].title = "Prolonging The Magic"; 
albums[3].year = 2001; albums[3].title = "Comfort Eagle"; 
albums[4].year = 2004; albums[4].title = "Pressure Chief"; 
albums[5].year = 2011; albums[5].title = "Showroom of Compassion"; 
    } 

public void printAlbum (int y) { 
System.out.println (albums[y].title); 
    } 

    } 

    public static void main(String[] args) { 
     new Main().new CAKE().printAlbum (0); 
    } 
} 

回答

3

这意味着你正在尝试访问/调用一个null对象的方法。就你而言,你初始化了一系列相册,但没有初始化数组中的每个相册。

您需要在阵列中初始化每个相册:

albums = new Album[6]; 
albums[0] = new Album(); 
albums[0].year = 1994; 
albums[0].title = "Motorcade Of Generosity"; 
... 

或者也可以简单(如@entonio指出):

albums = new Album[6]; 
albums[0] = new Album(1994, "Motorcade Of Generosity"); 
albums[1] = new Album(1996, "Fashion Nugget"); 
... 

既然你有一个适当的构造函数。

还有一件事:不要在每行中调用多个方法,它会帮助您调试。

+0

它是'专辑[0]',并且使用他的ctor它可以是'albums [0] =新专辑(1994,“Motorcade Of Generosity”);' – entonio 2011-05-11 00:53:43

+0

oops ...将编辑。谢谢! – MByD 2011-05-11 00:54:49

+0

啊,好吧。谢谢你,这很有道理。现在运行良好。 – James 2011-05-11 01:00:52

1

当您分配一个对象数组时,它将填充空值。您需要创建对象来填充它们。您的albums[0]未创建,因此尝试访问其year字段(即使写入)会导致NPE。

+0

+1 - 感谢您修理我。 – MByD 2011-05-11 00:57:26

+0

谢谢,我会提出一个编辑,但我仍然不太清楚SO的工作原理。我只是指出了失踪者,因为我确实认为OP可能会感到困惑。我非常尊重你们在这里用实际的代码写出适当的彻底回复,我对格式不太好,所以有时我只是试图解释我认为OP需要知道什么才能解决问题。 – entonio 2011-05-11 01:05:00

相关问题