C#:在类中存储实例;尝试获取其值时获取NullReferenceException

时间:2018-09-20 10:16:36

标签: c# oop nullreferenceexception

我是OOP和C#的新手。这是我做的一个小实验:

Using System;
class A
{
    public int X { get; set; }
    public static A[] a = new A[10];
    public static int i = 0;
    public A()
    {
        this.X = -2;
    }
    public A(int x)
    {
        this.X = x;
    }
    public static void Add(A b)
    {
        if (i < 10) a[i] = b;
        i++;
        return;
    }
    public void Reveal()
    {
        Console.WriteLine(X);
    }
    public static void Show()
    {
        for (int j=0; j<=10; ++j)
        {
            a[j].Reveal();
        }
    }
}

我尝试创建一个类,其实例存储在内部,最多10个对象。调用A.Show()时,将引发NullReferenceException:“对象引用未设置为对象的实例。”我猜想,肯定是创建了对象a[j],然后立即销毁了该对象。因此,它为a[j]提供了一个空值,因此得出结果? *这是我的main方法:

int val = 0;
while (val != -1)
{
    Console.Write("create a new object. new value: ");
    val = Console.ReadLine();
    A a = new A(val);
    A.Add(a);
 };
 A.Show();
 Console.ReadKey();
 return;

2 个答案:

答案 0 :(得分:2)

请注意循环的上限条件:

 for (int j=0; j<=10; ++j)
    {
        a[j].Reveal();
    }

数组a分配了10个项目,但是此代码显示您有11个项目(从0到10开始),因此将其更改为刚好低于10。还要尝试比较 因此正确的代码如下:

  public static void Show()
         {
        for (int j = 0; j < 10; ++j)
        {
            a[j]?.Reveal();//Or if(a[j] != null)
        }
    }

还对读取客户输入的行进行修改,必须如下:

      val = int.Parse(Console.ReadLine());//If you are sure that the input 

可以真正转换为int或

       int.TryParse(Console.ReadLine() , out int value);
            if(value != 0)
            {
                val = value;
                A a = new A(val);
                A.Add(a);
            }
            else
            {
                throw new Exception();
            }

答案 1 :(得分:0)

您要在分配i之前先递增a[i],所以a[0]为空,因为它将始终从1开始初始化a

尝试将添加方法更改为此:

public static void Add(A b)
{
    if (i < 10)
    {  //braces are important for readability
        a[i] = b;
    }
    i++;
    return;
}