Как исправить ошибку “Ссылка на объект не указывает на экземпляр объекта” [дубликат]

174
03 мая 2019, 16:00

На данный вопрос уже ответили:

  • Что такое NullReferenceException, и как мне исправить код? 2 ответа

При вызове метода Input возникает ошибка "Ссылка на объект не указывает на экземпляр объекта", которая ссылается на массив. Код и скрин с ошибкой приведен ниже.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CarAndBus
{
    class tCar
    {
        public double x { get; set; }
        public double y { get; set; }
        public double r { get; set; }
        public tCar(double x, double y)
        {
            this.x = x;
            this.y = y;
            //Output();
        }
        public virtual void Move(double ed, double a)
        {
            this.r = a * Math.PI / 180;
            this.x = this.x + ed * Math.Cos(r);
            this.y = this.y + ed * Math.Sin(r);
            Output();
        }
        public virtual void Output()
        {
            Console.WriteLine($"x= {this.x,2:f2} y= {this.y,2:f2}");
        }
    }
    class tBus : tCar
    {
        public string[] passengers { get; set; }
        public double money { get; set; }
        public double moneyPassengers { get; set; }
        public int capacity { get; set; }
        public tBus(double x, double y, int capacity) : base(x,y)
        {
            this.money = 0;
            this.capacity = capacity;
            string[] passengers = { };
        }
        public override void Move(double ed, double a)
        {
            this.r = a * Math.PI / 180;
            this.x = this.x + ed * Math.Cos(r);
            this.y = this.y + ed * Math.Sin(r);
            for (int i=0; i<this.passengers.Length; i++)
            {
                switch (this.passengers[i])
                {
                    case "обычный":
                        this.money+= 2*ed;
                        break;
                    case "студент":
                        this.money= 1.25*ed;
                        break;
                }
            }
            this.Output();
        }
        public override void Output()
        {
            Console.WriteLine($"x= {this.x,2:f2} y= {this.y,2:f2}\nКол-во пассажиров: {this.passengers.Length}\nКол-во полученных денег: {this.money,6:f2}\nВместимость автобуса: {this.capacity}");
        }
        public void Input(int people)
        {
            if (this.passengers.Length + people <= this.capacity)
            {
                for (int i = 0; i < people; i++)
                {
                    Console.Write($"Выберите тип {i + 1}-го вошедшего пассажира: 1-обычный 2-студент ");
                    int type = Convert.ToInt32(Console.ReadLine());
                    int countOfArr = this.passengers.Length;
                    switch (type)
                    {
                        case 1:
                            this.passengers[countOfArr] = "обычный";
                            break;
                        case 2:
                            this.passengers[countOfArr] = "студент";
                            break;
                    }
                }
                this.Output();
            }
            else
            {
                Console.Write("Недостаточно мест в автобусе");
            }
        }
        public void Exit(int passengers)
        {
            if (this.passengers.Length - passengers > 0)
            {
                for (int i = 0; i < passengers; i++)
                {
                    int []indexes = { this.passengers.Length - i };
                    this.passengers = (from x in this.passengers where !(from y in indexes select this.passengers.ElementAt(y)).Contains(x) select x).ToArray();
                }
                this.Output();
            }else
            {
                Console.Write("Количество человек в автобусе меньше, чем то значение, которое вы передаете в параметре");
            }
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            tBus Bus = new tBus(0, 0, 50);
            Bus.Input(2);
            Bus.Move(20, 45);
            Bus.Exit(3);
            Bus.Exit(1);
            Bus.Move(20, 135);
            Bus.Move(20, 225);
            Bus.Move(20, 315);
            Console.ReadKey();
        }
    }
}

Answer 1

В конструкторе вместо инициализации поля passengers происходит инициализация локальной переменной.

Поле же остается null, поэтому при попытке получить у него Length и происходит указанная ошибка.

READ ALSO
Ошибка при билде проекта (под android)

Ошибка при билде проекта (под android)

С чем может быть связана данная ошибка? никак не пойму

162
Как определить что это целое слово?

Как определить что это целое слово?

Имеется код где я из линии получаю строку которую надо заменитьДалее эту строку я передаю в regex функцию

141
Как открыть новый драйвер в OpenQA.Selenium.Chrome?

Как открыть новый драйвер в OpenQA.Selenium.Chrome?

Только учусь делать ботов для telegram и на данный момент уже есть рабочая функция, которая парсит данные с сайта моего ВУЗаПроблема заключается...

142
Переход с Newtonsoft.Json на Utf8.Json

Переход с Newtonsoft.Json на Utf8.Json

По словам автора, Utf8Json значительно быстрее и меньше ест памяти, и притом столь же функционален, как и Newtonsoft

171