类列表的空引用异常

时间:2016-07-21 17:43:43

标签: c# visual-studio-2015

我是编程新手,在创建一个具有另一个类的list属性的类然后在main中访问它时遇到了问题。尝试将项添加到列表后,我得到异常“对象引用未设置为对象的实例”我在运行时遇到此错误。我明白List<>引用是null但我试图理解为什么它是null以及如何绕过它。如果我只是在main中创建List,我的代码将正常运行,但我希望将来将它作为一个类。就像我说的那样,我是编程OOP的新手,并试图获得有关为什么会发生这种情况的一些信息。如果这是一个重复的问题,我道歉。我的代码段如下:

static void Main(string[] args)
    {
        BookList myBookList = new BookList();

        myBookList.bookList.Add(new Book("The Giver", "Lois Lowry", "Houghton Mifflin"));
        myBookList.bookList.Add(new Book("Telling Lies", "Paul Ekman", "Norton & Company"));
    }


class BookList
{
    public List<Book> bookList { get; set; }
}

class Book
{
    public Book(string title, string author, string publisher)
    {
        Title = title;
        Author = author;
        Publisher = publisher;
    }

    public string Title { get; set; }
    public string Author { get; set; }
    public string Publisher { get; set; }        
}

谢谢,我感谢所有的帮助!

3 个答案:

答案 0 :(得分:5)

创建BookList时,您实际上尚未初始化作为其成员的列表。您可以通过将初始化更改为:

来完成此操作
BookList myBookList = new BookList() {bookList = new List<Book>()};

或者通过编写初始化列表的BookList类的构造函数;看起来像这样:

class BookList
{
    public List<Book> bookList { get; set; }

    public BookList(){ //New constructor
        bookList = new List<Book>();
    }
}

您收到此错误的原因是,虽然您已创建BookList实例,但实际上并未确保BookList内部booklist属性已初始化。如果您尝试这样做就好了:

List<string> newList;
newList.Add("foo");

那是行不通的,因为你只是声明了newList,而没有初始化它。

答案 1 :(得分:0)

您需要初始化Boolist.bookList中的default ctor

class BookList
{
    public BookList() { bookList = new List<Book>; } // <<<<
    public List<Book> bookList { get; set; }
}

答案 2 :(得分:0)

您的public List<Book> bookList { get; set; }课程中的问题是BookList;你从来没有初始化它。例如,您可以在构造函数中执行此操作:

class BookList
{
    public List<Book> bookList { get; set; }

    public BookList
    {
        bookList = new List<Book>();
    }
}

请注意:属性应始终以Pascal大小写命名,即所有大写字母:BookList而不是bookList

另外,由于用BookList的另一个实例替换你的List<Book>并没有用,我建议你在setter上设置访问修饰符private因此它只能初始化一次,即在构造函数中:

public List<Book> bookList { get; private set; } // notice the "private" set