nullreferenceexception object reference not set to an instance of an object как исправить
Почему возникает ошибка System.NullReferenceException: ‘Object reference not set to an instance of an object?
Привет. Есть такой метод:
Отправляю запрос через Postman и ловлю в ответ
System.NullReferenceException: ‘Object reference not set to an instance of an object
В теле метода решил просто проверить, будет ли работать заполнение объекта и т.д.
В чем может быть проблема? По идеи должна вернутся строка с двумя JSON массивами, где все кроме beachType будет null.
вот вы описали класс:
вот вы создали экземпляр класса в методе роута:
Tours tours = new Tours();
заметьте, конструктор отработал, но поле tourInfos так и осталось не инициализированным
затем вы пытаетесь обратиться к не инициализированному полю объекта
и получаете вполне закономерную ругань платформы на «обращение по несуществующей ссылке».
Вам нужно инициализировать в конструкторе Tours, поле tourInfos (new List()).
Но на этом ваша история не закончится, т.к. на строчках
система вам опять выбросит то же самое исключение, потому что у вас в коллекции tourInfos не существует ни одного экземпляра класса TourInfo, к которому вы пытаетесь обратится по индексу и изменить у него какое-то свойство. Сначала создайте эти объекты, затем добавьте их в лист, а уж потом доставайте их из листа по индексу и заполняйте необходимые свойства(ну или сначала создайте объекты, задайте им свойства, а потом добавляйте в лист).
По идеи должна вернутся строка с двумя JSON массивами, где все кроме beachType будет null.
public class Tours
<
public List tourInfos < get; set; >= new List();
>
или создайте конструктор без параметров, где будет инициализирован список. Иначе он действительно null и компилятор вас не обманул
Что такое NullReferenceException, и как мне исправить код?
Когда я выполняю некоторый код, выбрасывается исключение NullReferenceException со следующим сообщением:
Object reference not set to an instance of an object.
В экземпляре объекта не задана ссылка на объект.
Что это значит, и как мне исправить код?
2 ответа 2
Причина
Вкратце
Вы пытаетесь воспользоваться чем-то, что равно null (или Nothing в VB.NET). Это означает, что либо вы присвоили это значение, либо вы ничего не присваивали.
Как и любое другое значение, null может передаваться от объекта к объекту, от метода к методу. Если нечто равно null в методе «А», вполне может быть, что метод «В» передал это значение в метод «А».
Более подробно
Отладка
Как определить источник ошибки? Кроме изучения, собственно, исключения, которое будет выброшено именно там, где оно произошло, вы можете воспользоваться общими рекомендациями по отладке в Visual Studio: поставьте точки останова в ключевых точках, изучите значения переменных, либо расположив курсор мыши над переменной, либо открыв панели для отладки: Watch, Locals, Autos.
Если вы хотите определить место, где значение ссылки устанавливается или не устанавливается, нажмите правой кнопкой на её имени и выберите «Find All References». Затем вы можете поставить точки останова на каждой найденной строке и запустить приложение в режиме отладки. Каждый раз, когда отладчик остановится на точке останова, вы можете удостовериться, что значение верное.
Примеры
Несколько общих примеров, в которых возникает исключение.
Цепочка
Неявно
То же верно для вложенных инициализаторов:
Массив
Элементы массива
Массив массивов
Collection/List/Dictionary
События
Неудачное именование переменных
Если бы в коде ниже у локальных переменных и полей были разные имена, вы бы обнаружили, что поле не было инициализировано:
Можно избежать проблемы, если использовать префикс для полей:
Цикл жизни страницы ASP.NET
Сессии ASP.NET
Пустые вью-модели ASP.NET MVC
Если вы возвращаете пустую модель (или свойство модели) в контроллере, то вью бросит исключение при попытке доступа к ней:
Способы избежать
Вы также можете бросать своё исключение, чтобы позже его поймать:
Использовать Debug.Assert для проверки на null для обнаружения ошибки до бросания исключения
Использовать GetValueOrDefault() для Nullable типов
Краткая запись для задания значения по умолчанию:
В дополнение к ответу @Discord @Squidward @Athari @Kyubey, давайте рассмотрим вопрос с другой стороны.
Если у вас в процессе выполнения программы случился NullReferenceException при доступе по какой-то ссылке, вы должны прежде всего задать себе важный вопрос:
Во многих случаях правильным ответом будет «нет», и значит, исправлять придётся истинную причину ошибки, которая находится в другом месте, и произошла раньше.
Пример: если у вас есть такой класс:
Так вот, мотор у машины быть обязан в любом случае, всегда. А вот водитель может в принципе и не сидеть в машине.
Где именно проводить границу между «внутренним» и «внешним» миром, вопрос достаточно нетривиальный. Обычно эта граница есть граница модуля (сборки), или даже той её логической части, которая находится в вашей ответственности. Слишком мелкое дробление ведёт к повторению бессмысленного кода (одна часть программы не доверяет другой и постоянно перепроверяет её). Слишком крупное дробление ведёт к необходимости держать в голове миллионы зависимостей («могу я тут передавать null или нет?»). Пользуйтесь здравым смыслом и личным опытом.
Null Reference Exception Класс
Определение
Исключение, возникающее при попытке разыменования указателя NULL на объект. The exception that is thrown when there is an attempt to dereference a null object reference.
Комментарии
Вы забыли создать экземпляр ссылочного типа. You’ve forgotten to instantiate a reference type. В следующем примере names объявляется, но никогда не создается экземпляр: In the following example, names is declared but never instantiated:
Вы забыли размер массива перед его инициализацией. You’ve forgotten to dimension an array before initializing it. В следующем примере values объявляется как массив целых чисел, но число содержащихся в нем элементов никогда не указывается. In the following example, values is declared to be an integer array, but the number of elements that it contains is never specified. Таким образом, попытка инициализировать свои значения вызвала NullReferenceException исключение. The attempt to initialize its values therefore thrown a NullReferenceException exception.
Исключение можно устранить, объявив число элементов в массиве перед его инициализацией, как показано в следующем примере. You can eliminate the exception by declaring the number of elements in the array before initializing it, as the following example does.
Дополнительные сведения об объявлении и инициализации массивов см. в разделе массивы и массивы. For more information on declaring and initializing arrays, see Arrays and Arrays.
Код в следующем примере предполагает, что Array.Find метод всегда возвращает объект, Person поле которого FirstName соответствует строке поиска. The code in the following example assumes that the Array.Find method always returns Person object whose FirstName field matches a search string. Поскольку совпадений нет, среда выполнения создает NullReferenceException исключение. Because there is no match, the runtime throws a NullReferenceException exception.
Чтобы устранить эту проблему, проверьте возвращаемое значение метода, чтобы убедиться, что он не null перед вызовом любого из его членов, как показано в следующем примере. To address this problem, test the method’s return value to ensure that it is not null before calling any of its members, as the following example does.
В следующем примере определяется Pages объект, который кэширует сведения о веб-страницах, которые представлены Page объектами. The following example defines a Pages object that caches information about web pages, which are presented by Page objects. Example.Main Метод проверяет, имеет ли текущая веб-страница заголовок, отличный от NULL, и отображает заголовок. The Example.Main method checks whether the current web page has a non-null title and, if it does, displays the title. Однако несмотря на эту проверку, метод создает NullReferenceException исключение. Despite this check, however, the method throws a NullReferenceException exception.
Выполняется перечисление элементов массива, содержащего ссылочные типы, и попытка обработать один из элементов вызывает NullReferenceException исключение. You’re enumerating the elements of an array that contains reference types, and your attempt to process one of the elements throws a NullReferenceException exception.
В следующем примере определяется массив строк. The following example defines a string array. for Оператор перечисляет элементы в массиве и вызывает метод каждой строки Trim перед отображением строки. A for statement enumerates the elements in the array and calls each string’s Trim method before displaying the string.
NullReferenceException использует COR_E_NULLREFERENCE HRESULT, имеющий значение 0x80004003. NullReferenceException uses the HRESULT COR_E_NULLREFERENCE, which has the value 0x80004003.
Список начальных значений свойств для экземпляра NullReferenceException, см. в разделе NullReferenceException конструкторы. For a list of initial property values for an instance of NullReferenceException, see the NullReferenceException constructors.
Обработка NullReferenceException в коде выпуска Handling NullReferenceException in release code
Обычно лучше избегать NullReferenceException, чем после появления. It’s usually better to avoid a NullReferenceException than to handle it after it occurs. Обработка исключений может затруднять обслуживание и понимание вашего кода, а иногда даже приводить к другим ошибкам. Handling an exception can make your code harder to maintain and understand, and can sometimes introduce other bugs. Исключение NullReferenceException часто является неисправимой ошибкой. A NullReferenceException is often a non-recoverable error. В этом случае, возможно, будет лучше позволить исключению остановить приложение. In these cases, letting the exception stop the app might be the best alternative.
Однако существует много ситуаций, в которых процесс обработки ошибки может оказаться полезен: However, there are many situations where handling the error can be useful:
Приложение может пропускать объекты, которые имеют значение null. Your app can ignore objects that are null. Например, если приложение получает и обрабатывает записи в базе данных, можно игнорировать некоторое число неверных записей, которые вызывают возникновение объектов со значением null. For example, if your app retrieves and processes records in a database, you might be able to ignore some number of bad records that result in null objects. Возможно, все, что потребуется, — записать неверные данные в файл журнала или интерфейс пользователя приложения. Recording the bad data in a log file or in the application UI might be all you have to do.
Можно попытаться исправить исключение. You can recover from the exception. Например, вызов веб-службы, возвращающей ссылочный тип, может вернуть значение null, если соединение потеряно, или время ожидания соединения истекло. Можно попытаться восстановить подключение и повторить вызов. For example, a call to a web service that returns a reference type might return null if the connection is lost or the connection times out. You can attempt to reestablish the connection and try the call again.
Можно восстановить приложение до допустимого состояния. You can restore the state of your app to a valid state. Например, вы могли выполнять задачу, состоящую из нескольких шагов, которая требует сохранения информации в хранилище данных, перед вызовом метода, который создает исключение NullReferenceException. For example, you might be performing a multi-step task that requires you to save information to a data store before you call a method that throws a NullReferenceException. Если неинициализированный объект повредит запись данных, можно будет удалить предыдущие данные перед закрытием приложения. If the uninitialized object would corrupt the data record, you can remove the previous data before you close the app.
Требуется сообщить об исключении. You want to report the exception. Например, если ошибка была вызвана неправильным действием пользователя приложения, можно создать сообщение, которое поможет ему предоставить правильные сведения. For example, if the error was caused by a mistake from the user of your app, you can generate a message to help him supply the correct information. Кроме того, можно зарегистрировать сведения об ошибке, которые помогут устранить проблему. You can also log information about the error to help you fix the problem. Некоторые платформы, например, ASP.NET, содержат высокогоуровневый обработчик исключений, который перехватывает все ошибки, чтобы приложения никогда аварийно не завершало работу; в этом случае только благодаря регистрации исключения вы сможете узнать о наличии ошибки. Some frameworks, like ASP.NET, have a high-level exception handler that captures all errors to that the app never crashes; in that case, logging the exception might be the only way you can know that it occurs.
Конструкторы
Инициализирует новый экземпляр класса NullReferenceException, устанавливая в качестве значения свойства Message нового экземпляра системное сообщение с описанием ошибки: «При запросе экземпляра объекта обнаружено значение NULL». Initializes a new instance of the NullReferenceException class, setting the Message property of the new instance to a system-supplied message that describes the error, such as «The value ‘null’ was found where an instance of an object was required.» Это сообщение учитывает культуру текущей системы. This message takes into account the current system culture.
Инициализирует новый экземпляр класса NullReferenceException с сериализованными данными. Initializes a new instance of the NullReferenceException class with serialized data.
Инициализирует новый экземпляр класса NullReferenceException с указанным сообщением об ошибке. Initializes a new instance of the NullReferenceException class with a specified error message.
Инициализирует новый экземпляр класса NullReferenceException указанным сообщением об ошибке и ссылкой на внутреннее исключение, вызвавшее данное исключение. Initializes a new instance of the NullReferenceException class with a specified error message and a reference to the inner exception that is the cause of this exception.
Свойства
Возвращает коллекцию пар «ключ-значение», предоставляющую дополнительные сведения об исключении. Gets a collection of key/value pairs that provide additional user-defined information about the exception.
Получает или задает ссылку на файл справки, связанный с этим исключением. Gets or sets a link to the help file associated with this exception.
Возвращает или задает HRESULT — кодированное числовое значение, присвоенное определенному исключению. Gets or sets HRESULT, a coded numerical value that is assigned to a specific exception.
Возвращает экземпляр класса Exception, который вызвал текущее исключение. Gets the Exception instance that caused the current exception.
Возвращает сообщение, описывающее текущее исключение. Gets a message that describes the current exception.
Возвращает или задает имя приложения или объекта, вызывавшего ошибку. Gets or sets the name of the application or the object that causes the error.
Получает строковое представление непосредственных кадров в стеке вызова. Gets a string representation of the immediate frames on the call stack.
Возвращает метод, создавший текущее исключение. Gets the method that throws the current exception.
Методы
Определяет, равен ли указанный объект текущему объекту. Determines whether the specified object is equal to the current object.
При переопределении в производном классе возвращает исключение Exception, которое является первопричиной одного или нескольких последующих исключений. When overridden in a derived class, returns the Exception that is the root cause of one or more subsequent exceptions.
Служит хэш-функцией по умолчанию. Serves as the default hash function.
При переопределении в производном классе задает объект SerializationInfo со сведениями об исключении. When overridden in a derived class, sets the SerializationInfo with information about the exception.
Возвращает тип среды выполнения текущего экземпляра. Gets the runtime type of the current instance.
Создает неполную копию текущего объекта Object. Creates a shallow copy of the current Object.
Создает и возвращает строковое представление текущего исключения. Creates and returns a string representation of the current exception.
События
Возникает, когда исключение сериализовано для создания объекта состояния исключения, содержащего сериализованные данные об исключении. Occurs when an exception is serialized to create an exception state object that contains serialized data about the exception.
Что такое исключение NullReferenceException и как его исправить?
Ссылка на объект, не установленная на экземпляр объекта.
Что это означает, и что я могу сделать, чтобы исправить эту ошибку?
14 ответов
Чтобы использовать методы и член объекта, вы должны сначала создать этот объект. Если вы не создали его (переменная, которая должна содержать объект, не инициализирована), но вы пытаетесь использовать его методы или переменные, вы получите эту ошибку.
Иногда вы можете просто забыть выполнить инициализацию.
Отредактировано: new не может вернуть значение NULL, но возникает исключение при сбое. Давным-давно это было в некоторых языках, но не больше. Спасибо @Джон Сондерс за то, что указал на это.
Это означает, что ваш код использовал переменную ссылки на объект, для которой было установлено значение null (то есть он не ссылался на фактический экземпляр объекта).
Чтобы предотвратить ошибку, объекты, которые могут быть нулевыми, должны быть проверены на нулевое значение перед использованием.
Строка ошибки «Ссылка на объект не установлена для экземпляра объекта.» Гласит, что вы не назначили объект экземпляра для ссылки на объект, и все же вы получаете доступ к свойствам / методам этого объекта.
например: допустим, у вас есть класс с именем myClass, и он содержит одно свойство prop1.
Теперь вы получаете доступ к этому prop1 в каком-то другом классе, как показано ниже:
вышеприведенная строка выдает ошибку, поскольку ссылка на класс myClass объявлена, но не создана, или экземпляр объекта не назначен для ссылки на этот класс.
Чтобы это исправить, вы должны создать экземпляр (назначить объект для ссылки на этот класс).
Вы используете объект, который содержит ссылку на нулевое значение. Так что это дает нулевое исключение. В этом примере строковое значение равно нулю, и при проверке его длины произошло исключение.
System.NullReferenceException: ссылка на объект не установлена на экземпляр объекта. в Program.Main ()
Если мы рассмотрим распространенные сценарии, в которых это исключение может быть сгенерировано, доступ к свойствам осуществляется с помощью объекта сверху.
здесь, если адрес равен нулю, вы получите NullReferenceException.
Таким образом, в качестве практики мы всегда должны использовать проверку null, прежде чем обращаться к свойствам в таких объектах (особенно в общем)
Добавление случая, когда имя класса для сущности, используемой в платформе сущностей, совпадает с именем класса для файла кода веб-формы.
Затем следующий код вызовет исключение NullReferenceException при вызове context.SaveChanges ()
Ради полноты класса DataContext
и Связаться с объектом класса. Иногда классы сущностей являются частичными классами, так что вы можете расширять их и в других файлах.
Ошибка возникает, когда сущность и класс codebehind находятся в одном пространстве имен. Чтобы это исправить, переименуйте класс сущности или класс codebehind для Contact.aspx.
Причина Я до сих пор не уверен в причине. Но всякий раз, когда какой-либо из классов сущностей расширяет System.Web.UI.Page, эта ошибка возникает.
Это бросит NullReferenceException на актерский состав. Это кажется вполне очевидным в приведенном выше примере, но это может произойти в более сложных запоздалых сценариях, когда нулевой объект был возвращен из некоторого кода, который вам не принадлежит, и приведение, например, генерируется некоторой автоматической системой.
Одним из примеров этого является этот простой фрагмент привязки ASP.NET с элементом управления Calendar:
У меня другая точка зрения, чтобы ответить на это. Такого рода ответы «что еще я могу сделать, чтобы избежать этого? »
TL; DR: попробуйте использовать Html.Partial вместо Renderpage
Отладка показала, что модель была нулевой внутри MyOtherView. Пока я не изменил это на:
Но я смог запустить приложение без проблем с этой «ошибкой». Мне удалось избавиться от ошибки, изменив структуру цикла foreach так:
Хотя у меня такое ощущение, что Visual Studio неправильно читала амперсанды и скобки.
NullReferenceException или объектная ссылка, не установленная для экземпляра объекта, возникает, когда объект класса, который вы пытаетесь использовать, не создается. Например:
Предположим, что у вас есть класс с именем Student.
Теперь рассмотрим другой класс, в котором вы пытаетесь получить полное имя учащегося.
Это означает, что рассматриваемая переменная ни на что не указана. Я мог бы сгенерировать это так:
Это приведет к ошибке, потому что, хотя я объявил переменную » connection «, она ни на что не указана. Когда я пытаюсь вызвать участника « Open », нет ссылки для его разрешения, и он выдаст ошибку.
Чтобы избежать этой ошибки:
Вы можете исправить NullReferenceException чистым способом с помощью Null-условных операторов в c # 6 и написать меньше кода для обработки нулевых проверок.
Он используется для проверки на нулевое значение перед выполнением операции доступа к члену (?.) Или индекса (? [).
В результате имя будет нулевым, когда p равно нулю или когда p.Spouse равно нулю.
В противном случае имени переменной будет присвоено значение p.Spouse.FirstName.
Если вы получаете это сообщение во время сохранения или компиляции сборки, просто закройте все файлы, а затем откройте любой файл для компиляции и сохранения.
Для меня причина была в том, что я переименовал файл, а старый файл все еще был открыт.
NullReferenceException в Unity
Поскольку многие пользователи сталкиваются с NullReferenceException: Object reference not set to an instance of an object ошибкой в Unity, я подумал, что было бы неплохо собрать из нескольких источников некоторые объяснения и способы исправления этой ошибки.
симптомы
Я получаю сообщение об ошибке ниже, появляющееся в моей консоли, что это значит и как я могу это исправить?
NullReferenceException: ссылка на объект не установлена на экземпляр объекта
Тип значения против Тип ссылки
Например, Vector3 это тип значения (структура, содержащая координаты и некоторые функции), в то время как компоненты, прикрепленные к вашему GameObject (включая ваши собственные сценарии, наследуемые от MonoBehaviour ), являются ссылочным типом.
Когда я могу получить исключение NullReferenceException?
NullReferenceException сбрасываются, когда вы пытаетесь получить доступ к ссылочной переменной, которая не ссылается на какой-либо объект, поэтому она имеет значение null (адрес памяти указывает на 0).
Некоторые общие места NullReferenceException будут подняты:
Управление GameObject / Component, который не был указан в инспекторе
Извлечение компонента, который не присоединен к GameObject, а затем попытка манипулировать им:
Доступ к GameObject, который не существует:
Попытка использовать результат получателя, который возвращает null :
Доступ к элементу неинициализированного массива
Менее распространенный, но раздражающий, если вы не знаете об делегатах C #:
Если вы поняли предыдущие параграфы, вы знаете, как исправить ошибку: убедитесь, что ваша переменная ссылается (указывает на) на экземпляр класса (или содержит хотя бы одну функцию для делегатов).
Проще сказать, чем сделать? Да, в самом деле. Вот несколько советов, чтобы избежать и определить проблему.
«Грязный» способ: метод try & catch:
«Чистый» способ (ИМХО): чек
Когда вы сталкиваетесь с ошибкой, которую вы не можете решить, всегда полезно найти причину проблемы. Если вы «ленивы» (или если проблему легко решить), используйте Debug.Log для отображения на консоли информацию, которая поможет вам определить причину проблемы. Более сложным способом является использование точек останова и отладчика вашей IDE.
Использование Debug.Log весьма полезно для определения, например, какая функция вызывается первой. Особенно, если у вас есть функция, отвечающая за инициализацию полей. Но не забудьте удалить их, Debug.Log чтобы не загромождать вашу консоль (и по соображениям производительности).
Еще один совет, не стесняйтесь «обрезать» свои вызовы функций и добавить, Debug.Log чтобы сделать некоторые проверки.
Сделайте это, чтобы проверить, установлены ли все ссылки:
Источники:
Хотя мы можем легко выполнить проверку, чтобы убедиться, что мы не пытаемся получить доступ к нулевой ссылке, это не всегда подходящее решение. Во многих случаях в программировании Unity наша проблема может быть связана с тем, что ссылка не должна быть нулевой. В некоторых ситуациях простое игнорирование нулевых ссылок может нарушить наш код.
Например, это может быть ссылка на наш контроллер ввода. Здорово, что игра не вылетает из-за исключения с нулевой ссылкой, но нам нужно выяснить, почему нет контроллера ввода, и исправить эту проблему. Без этого у нас есть игра, которая может не рухнуть, но также не может принять ввод.
Ниже я перечислю возможные причины и решения, так как сталкиваюсь с ними в других вопросах.
Вы пытаетесь получить доступ к классу «менеджер»?
Вы ссылаетесь на экземпляр вашего объекта?
Вы инстанцируете свой экземпляр?
Учебник Unity по классам объясняет практику создания и использования конструкторов.
Используете ли вы GetComponent () метод с предположением, что компонент существует?
Во-первых, убедитесь, что мы всегда вызываем GetComponent () до вызова методов из экземпляра компонента.
Вы пытались пересобрать свой проект?
В некоторых случаях Unity может вызвать проблемы, пытаясь ссылаться на кэшированную версию игрового объекта. В соответствии со старым решением «выключите и снова включите», попробуйте удалить папку библиотеки и заново открыть Unity. Unity будет вынуждена пересобрать ваш проект. Это может решить некоторые очень специфические случаи этой проблемы и должно указывать на проблемы, которые не возникнут в окончательной сборке.