Что означает "Объектная ссылка, не установленная на экземпляр объекта"?

Я получаю эту ошибку, и я не уверен, что это значит?

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

Ответ 1

Переменные в .NET являются либо ссылочными типами, либо типами значений. Типы значений - это примитивы, такие как целые числа и booleans или структуры ( и их можно идентифицировать, поскольку они наследуют от System.ValueType). Логические переменные, объявленные, имеют значение по умолчанию:

bool mybool;
//mybool == false

Типы ссылок, если они объявлены, не имеют значения по умолчанию:

class ExampleClass
{
}

ExampleClass exampleClass; //== null

Если вы попытаетесь получить доступ к члену экземпляра класса с использованием нулевой ссылки, вы получите System.NullReferenceException. Это то же самое, что и ссылка объекта, не установленная на экземпляр объекта.

Следующий код является простым способом воспроизведения этого:

static void Main(string[] args)
{
    var exampleClass = new ExampleClass();
    var returnedClass = exampleClass.ExampleMethod();
    returnedClass.AnotherExampleMethod(); //NullReferenceException here.
}

class ExampleClass
{
    public ReturnedClass ExampleMethod()
    {
        return null;
    }
}

class ReturnedClass
{
    public void AnotherExampleMethod()
    {
    }
}

Это очень распространенная ошибка и может возникнуть из-за всех причин. Основная причина действительно зависит от конкретного сценария, с которым вы столкнулись.

Если вы используете API или вызываете методы, которые могут возвращать null, тогда важно обработать это изящно. Основной метод, описанный выше, может быть изменен таким образом, что исключение NullReferenceException никогда не будет видно пользователю:

static void Main(string[] args)
{
    var exampleClass = new ExampleClass();
    var returnedClass = exampleClass.ExampleMethod();

    if (returnedClass == null)
    {
        //throw a meaningful exception or give some useful feedback to the user!
        return;
    }

    returnedClass.AnotherExampleMethod();
}

Все вышесказанное на самом деле просто подсказывает основы .NET Type. Для получения дополнительной информации я бы рекомендовал либо собрать CLR через С#, либо прочитать это статья MSDN того же автора - Джеффри Рихтера. Также проверьте, намного сложнее пример, когда вы можете встретить исключение NullReferenceException.

Некоторые команды, использующие Resharper, используют атрибуты JetBrains для комментирования кода, чтобы выделить, где ожидаются (не) нули.

Ответ 2

Еще один простой способ получить это:

 Person myPet = GetPersonFromDatabase();
 // check for myPet == null... AND for myPet.PetType == null
 if ( myPet.PetType == "cat" ) <--- fall down go boom!

Ответ 3

Не быть тупым, но это означает именно то, что он говорит. Одна из ваших ссылок на объекты - NULL. Вы увидите это при попытке доступа к свойству или методу объекта NULL'd.

Ответ 4

В двух словах это означает, что вы пытаетесь получить доступ к объекту, не создавая его. Возможно, вам нужно будет использовать ключевое слово "new", чтобы создать его экземпляр вначале. Создайте его экземпляр.

Например,

public class MyClass
{
   public int Id {get; set;}
}

MyClass myClass;

myClass.Id = 0; <----------- An error will be thrown here.. because myClass is null here...

Вам нужно будет использовать:

myClass = new MyClass();
myClass.Id = 0;

Надеюсь, я дал понять.

Ответ 5

Это означает, что вы сделали что-то вроде этого.

Class myObject = GetObjectFromFunction();

И без делать

if(myObject!=null), вы продолжаете делать myObject.Method();

Ответ 6

что означает эта ошибка? Ссылка на объект не установлена ​​в экземпляр объекта.

точно, что он говорит, вы пытаетесь использовать нулевой объект, как если бы он был правильно ссылочный объект.

Ответ 7

В большинстве случаев, когда вы пытаетесь определить значение в объекте, а если значение равно null, возникает такое исключение. Пожалуйста, проверьте эту ссылку.

для самообучения вы можете поместить некоторые условия проверки. как

if (myObj== null)
Console.Write("myObj is NULL");

Ответ 8

Я столкнулся с проблемой, пока я пытался работать с приложением Smartcard, у нее есть один компонент COM, который скомпилирован с помощью платформы dot net 2.0 нашими старшими разработчиками, когда я пытался использовать эти компоненты DLL с моим проектом, который был разработан в рамках 4.0. Когда VS 2010 конвертирует это приложение vs2008 в vs2010, я получил ссылку "Ссылка на объект", не установленную в экземпляр объекта.. Когда я попытался отслеживать, я обнаружил, что ошибка находится на нескольких формах, которые используя эту ссылочную dll (которая скомпилирована с фреймворком 2.0).

Я открыл файл resx этих форм и изменил строку ниже

    <metadata name="ErrorProvider1.TrayLocation" type="System.Drawing.Point, System.Drawing, **Version=4.0.0.0**, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">

Для

     <metadata name="ErrorProvider1.TrayLocation" type="System.Drawing.Point, System.Drawing, **Version=2.0.0.0**, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">

Итак, что я изменил здесь, я просто изменил его версию 4.0.0.0 на 2.0.0.0, и он отлично работает.

Я думаю, что это понижающий, но не весь проект, только несколько форм находятся под фреймворком 2.0, и это вообще не повлияет на проект.

Ответ 9

Если у меня есть класс:

public class MyClass
{
   public void MyMethod()
   {

   }
}

а затем выполните:

MyClass myClass = null;
myClass.MyMethod();

Вторая строка вызывает это исключение, потому что я вызываю метод на ссылочном типе, который null (т.е. созданный путем вызова myClass = new MyClass())