NullReferenceException при попытке работы с массивом

182
01 апреля 2021, 06:10

При попытке работы с массивом OnlyGreatMarks в последнем методе происходит ошибка:

System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта.

Причем одна и та же ошибка появляется в двух разных местах (отмечены комментарием).

Данный метод должен вернуть ступенчатый массив со значениями из двумерного массива, которые больше 8.

Вот сам код:

class Matrix
{
    private int[,] matr;
    static private Random rand = new Random();
    public Matrix(int[,] matr)
    {
        this.matr = matr;
    }
    public Matrix()
    {
        matr = new int[30,10];
        for (int i = 0; i < matr.GetLength(0); i++)
            for (int j = 0; j < matr.GetLength(1); j++)
                matr[i, j] = rand.Next(1,10);
    }
    public override string ToString()
    {
        string result = "";
        for (int i = 0; i < matr.GetLength(0); i++)
        {
            for (int j = 0; j < matr.GetLength(1); j++)
            {
                result += $"{matr[i,j]}\t";
            }
            result += "\n";
        }
        return result;    
    }
    public void GreatMarksOnly()
    {
        int[] OnlyGreatMarks = new int[0]; 
        int[][] MatrixWithGreatMarks = new int[0][];
        for (int i = 0; i < matr.GetLength(0); i++)
        {
            for (int j = 0; j < matr.GetLength(1); j++)
            {
                if (matr[i, j] > 8)
                {
                    Array.Resize(ref OnlyGreatMarks, OnlyGreatMarks.Length + 1);//первый NullReferenceException
                    OnlyGreatMarks[OnlyGreatMarks.Length - 1] = matr[i, j];
                }
            }
            if (OnlyGreatMarks.Length > 0)//второй NullReferenceException
            {
                Array.Resize(ref MatrixWithGreatMarks, MatrixWithGreatMarks.Length + 1); 
                MatrixWithGreatMarks[MatrixWithGreatMarks.Length - 1] = OnlyGreatMarks;
                OnlyGreatMarks = null;
            }
        }
        for (int i = 0; i < MatrixWithGreatMarks.Length; i++)
        {
            for (int j = 0; j < MatrixWithGreatMarks[i].Length; j++)
                Console.Write($"{MatrixWithGreatMarks[i][j]}\t");
            Console.WriteLine();
        }
    }
}
Answer 1
private static void ExtendArray<T>(ref T[] array, T new_value)
{
    if (array != null)
    {
        Array.Resize(ref array, array.Length + 1);
        array[array.Length - 1] = new_value;
    }
    else
    {
        array = new T[] { new_value };
    }
}
public void GreatMarksOnly()
{
        int[] OnlyGreatMarks = new int[0];
        int _size = OnlyGreatMarks.Length;
        int[][] MatrixWithGreatMarks = new int[0][];
        for (int i = 0; i < matr.GetLength(0); i++)
        {
            for (int j = 0; j < matr.GetLength(1); j++)
            {
                if (matr[i, j] > 8)
                {
                    //Array.Resize(ref OnlyGreatMarks, OnlyGreatMarks.Length + 1);//первый NullReferenceException
                    _size = OnlyGreatMarks.Length;
                    ExtendArray(ref OnlyGreatMarks, _size + 1);
                    _size = OnlyGreatMarks.Length;
                    OnlyGreatMarks[_size - 1] = matr[i, j];
                }
            }
            _size = OnlyGreatMarks.Length;
            if (_size > 0)//второй NullReferenceException
            {
                Array.Resize(ref MatrixWithGreatMarks, MatrixWithGreatMarks.Length + 1);
                MatrixWithGreatMarks[MatrixWithGreatMarks.Length - 1] = OnlyGreatMarks;
                OnlyGreatMarks = null;
            }
        }
}
READ ALSO
С#. Вызов метода из метода в одном классе

С#. Вызов метода из метода в одном классе

Ну очень глупый вопрос наверное :(

157
Количество элементов на странице в зависимости от введенного числа

Количество элементов на странице в зависимости от введенного числа

Подскажите, пожалуйста, как в ASPNET CORE MVC сделать так, чтобы по вводу нужного числа в текстовом поле во view, появлялось количество элементов (текстовых...

125
Как сообщать об изменениях расчетного привязанного свойства класса в WPF?

Как сообщать об изменениях расчетного привязанного свойства класса в WPF?

Подскажите, пожалуйста, где я не правЯ создал класс Bill, в котором есть ряд полей

176
Как отправить картинку через телеграм бота не загружая ее на сервер?

Как отправить картинку через телеграм бота не загружая ее на сервер?

Пытаюсь написать бота,который накладывает текст,отправленный пользователем, на картинку(картинка одна и та же)Найти способ нормально загружать...

157