将数组传递给存储过程时的空引用

时间:2013-05-21 08:40:47

标签: c# sql unit-testing

我收到以下错误:

  

System.NullReferenceException:未将对象引用设置为对象的实例。

当我尝试运行此单元测试时:

    [TestMethod]
    public void TestDecreaseTutorArea()
    {
        HelpWith info = new HelpWith();
        info.Subcategories[0] = 1;
        info.UserId = 14;

        TutorService tutorService = new TutorService();

        tutorService.DecreaseTutorArea(info);
    }

HelpWith类看起来像这样:

public class HelpWith
{
    public int UserId { get; set; }
    public int[] Categories { get; set; }
    public int[] Subcategories { get; set; }
}

有谁知道我做错了什么?在我看来,我很清楚info-Subcategories是什么。

3 个答案:

答案 0 :(得分:3)

您尚未将阵列初始化为任何大小。而您正在尝试访问元素

 info.Subcategories[0] = 1;

这就是你得到例外的原因。

在使用或构造函数之前将它们初始化为某种大小。

public void TestDecreaseTutorArea()
    {
        HelpWith info = new HelpWith();
        info.SubCategories = new int[10]; //here
        info.Subcategories[0] = 1;
        info.UserId = 14;

        TutorService tutorService = new TutorService();

        tutorService.DecreaseTutorArea(info);
    }

或者在类构造函数中:

public class HelpWith
{
    public int UserId { get; set; }
    public int[] Categories { get; set; }
    public int[] Subcategories { get; set; }
    //constructor
    public HelpWith()
    {
      this(10,10);
    }

    public HelpWith(int CategorySize, int SubCategorySize)
    {
     Categories = new int[CategorySize]; //some size
     SubCategories = new int[SubCategorySize];
    }
}

如果您事先不知道数组的大小,请使用List<int>,但请记住在构造函数中初始化它,如:

public class HelpWith
{
    public int UserId { get; set; }
    public List<int> Categories { get; set; }
    public List<int> Subcategories { get; set; }
    //constructor
    public HelpWith()
    {
        Categories = new List<int>();
        Subcategories = new List<int>();
    }
}

然后使用它:

[TestMethod]
public void TestDecreaseTutorArea()
{
    HelpWith info = new HelpWith();
    info.Subcategories.Add(1);
    info.UserId = 14;

    TutorService tutorService = new TutorService();

    tutorService.DecreaseTutorArea(info);
}

答案 1 :(得分:1)

错误发生在这里

[TestMethod]
public void TestDecreaseTutorArea()
{
    HelpWith info = new HelpWith();
    info.Subcategories[0] = 1; <<<<<<<<
}

因为info.Subcategoriesnull。要修复此问题,请添加类似

的构造函数
public class HelpWith
{
    public int UserId { get; set; }
    public int[] Categories { get; set; }
    public int[] Subcategories { get; set; }

    HelpWith()
    {
        Categories = new int[5];
        Subcategories = new int[5];
    }
}

你可能想要使用List<int>而不是int[],因为列表是动态数组,它可以增大和缩小(意味着你不必提供初始值)大小,正如您需要使用int[])。

答案 2 :(得分:0)

您需要在构造函数中或在创建对象之后初始化数组:

    HelpWith info = new HelpWith();
    info.Subcategories = new int[20];
    info.Subcategories[0] = 1;
    info.UserId = 14;

系统还有什么意思才能知道这些数组应该有多大?

(或者,考虑使用不同的数据类型,例如List<int>,如果您不想管理数组的长度 - 但仍需要初始化它们)