@ellz

Почему возникает ошибка System.NullReferenceException: 'Object reference not set to an instance of an object?

Привет. Есть такой метод:
[HttpPost]
        [Route("postTourInfo")]
        public string Post([FromBody] GettingTourInfo value)
        {
            Tours tours = new Tours();
         
            tours.tourInfos[0].beachType = "one";// здесь возникает ошибка
            tours.tourInfos[1].beachType = "two";

            return JsonConvert.SerializeObject(tours);
        }

и такие классы:
public class GettingTourInfo
    {
        public string fromCity { get; set; }
        public string toCountry { get; set; }
        public DateTime departureDate { get; set; }
        public int amountNights { get; set; }
        public int amountAdults { get; set; }
    }

    public class TourInfo
    {
        public int statusCode { get; set; } //200, если туры найдены, 404 - если не найдены
        public string tourName { get; set; } //названиеТура
        public string hotelName { get; set; } //названиеОтеля
        public int hotelRating { get; set; } //рейтингОтеля
        public int line { get; set; } //линия
        public string beachType { get; set; } //типа поляжа(песок, песок с галькой, галька, платформа)
        public int distanceToBeach { get; set; }// растояние до пляжа
        public int distanceToAirport { get; set; } // растояние до аэропорта
    }

    public class Tours
    {
        public List<TourInfo> tourInfos { get; set; }
    }


Отправляю запрос через Postman и ловлю в ответ
System.NullReferenceException: 'Object reference not set to an instance of an object


В теле метода решил просто проверить, будет ли работать заполнение объекта и т.д.
В чем может быть проблема? По идеи должна вернутся строка с двумя JSON массивами, где все кроме beachType будет null.

Проект .Net Core 2.0.
  • Вопрос задан
  • 20001 просмотр
Решения вопроса 2
freeExec
@freeExec
Участник OpenStreetMap
Потому что список tours.tourInfos ни кто не создал. Вы его только объявили, а new не стали.
Ответ написан
Комментировать
@tex0
вот вы описали класс:
public class Tours
    {
        public List<TourInfo> tourInfos { get; set; }
    }


вот вы создали экземпляр класса в методе роута:
Tours tours = new Tours();

заметьте, конструктор отработал, но поле tourInfos так и осталось не инициализированным
затем вы пытаетесь обратиться к не инициализированному полю объекта
tours.tourInfos[0].beachType = "one";// здесь возникает ошибка | И правильно, потому что tours.tourInfos - null
            tours.tourInfos[1].beachType = "two";

и получаете вполне закономерную ругань платформы на "обращение по несуществующей ссылке".
Вам нужно инициализировать в конструкторе Tours, поле tourInfos (new List()).
Но на этом ваша история не закончится, т.к. на строчках
tours.tourInfos[0].beachType = "one";// здесь возникает ошибка
            tours.tourInfos[1].beachType = "two";

система вам опять выбросит то же самое исключение, потому что у вас в коллекции tourInfos не существует ни одного экземпляра класса TourInfo, к которому вы пытаетесь обратится по индексу и изменить у него какое-то свойство. Сначала создайте эти объекты, затем добавьте их в лист, а уж потом доставайте их из листа по индексу и заполняйте необходимые свойства(ну или сначала создайте объекты, задайте им свойства, а потом добавляйте в лист).
По идеи должна вернутся строка с двумя JSON массивами, где все кроме beachType будет null.

нет, судя по вашему коду вам вернётся один JSON массив с двумя объектами в нём.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Binky
public class Tours
{
public List tourInfos { get; set; } = new List();
}

или создайте конструктор без параметров, где будет инициализирован список. Иначе он действительно null и компилятор вас не обманул
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы