C #: хранение экземпляров в классе;получить NullReferenceException при попытке получить их значение - PullRequest
0 голосов
/ 20 сентября 2018

Я новичок в ООП и 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 голосов
/ 21 сентября 2018

Обратите внимание на условие верхней границы цикла:

 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();
            }
0 голосов
/ 20 сентября 2018

Вы увеличиваете i перед присваиванием a[i], поэтому a[0] равно нулю, потому что всегда будет начинать инициализацию a со значения 1.

Попробуйте изменить метод добавления следующим образом:

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