2011-01-29 4 views
1

У меня есть следующий класс:Null ссылка ошибка при доступе к массиву

public class MyClass 
{ 
    public MyArrObj[] arrOfObj; //Array of objects 
} 

При попытке доступа к нему с помощью:

MyClass myClass = new MyClass; 
myClass.arrOfObj = GetData(); 

это дает мне пустое исключение. Если бы это был не массив, я мог бы это сделать new'd, но я не уверен, как справиться с этим.

+5

Показать трассировку стека. Вы уверены, что NRE не находится в реализации «GetData»? –

+0

Также покажите нам, что делает GetData. –

+0

Возможный дубликат [Что такое исключение NullReferenceException в .NET?] (Http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-in-net) –

ответ

0

Способ использования вашего метода GetData(), он должен возвращать массив.

Вот несколько способов создания массива на лету (вам все равно нужно заполнить их, хотя):

int[] x = new int[5] ; // create a 5-element array of integers 
int[] y = (int[]) Array.CreateInstance(typeof(int),5) ; // create a 5 element array of integers 

Приветствия.

+0

Wow. Мне нравится эта вторая. – Alxandr

0

Вам нужно сделать что-то вроде этого:

class Program 
    { 
     static void Main(string[] args) 
     { 
      MyClass myClass = new MyClass(); 
      myClass.arrOfObj = GetData(); 
      foreach (var item in myClass.arrOfObj) 
      { 
       Console.WriteLine(item.ToString()); 
      } 

     Console.ReadLine(); 

    } 

    private static int[] GetData() 
    { 
     return new int[]{1,2,3,4,5}; 
    } 
} 

public class MyClass 
{ 
    public int[] arrOfObj; //Array of objects 
} 

метод GetData является важной частью. он должен инициализировать новый массив и вернуть его.

0

Если подпись вашего метода GetData() выглядит как public MyArrObj[] GetData(), тогда ваш код должен работать правильно. Я тестировал код с 2-мя версиями метода «GetData»:

public MyArrObj[] GetData() 
{ 
    return new MyArrObj[3] { new MyArrObj(), new MyArrObj(), new MyArrObj() }; 
} 

public MyArrObj[] GetData2() 
{ 
    return new MyArrObj[0]; 
} 

Ни один из этих методов бросил пустую ссылку исключение. Я бы заподозрил, что внутри вашего метода есть что-то еще, которое бросает нулевую ссылку, а не операцию присвоения результатов этого метода в поле arrOfObj.

2

При создании массива ссылочного типа (MyArrObj в вашем случае) требуется выделить память для каждого элемента массива (используя оператор new) в дополнение к распределению памяти для самого массива.

Массив ссылочных типов

Например, если вы создаете MyArrObj массив,

MyArrObj[] objectArray = new MyArrObj[3];

Затем элементы массива objectArray[0] к objectArray[2] все равно будет null. Требуется отдельная инициализация.

objectArray[0] = new MyArrObj();

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

objectArray[0].SomeMethod();
SomePropertyType readProperty = objectArray[0].SomeProperty;

Если пропустить инициализацию элементов массива, то при попытке доступа к члену элемента массива будет дать System.NullReferenceException

objectArray[0].SomeMethod(); // throws NullReferenceException

потому что objectArray[0]; является null.

Вы можете проверить это с помощью

if(objectArray[0] == null) 
{ 
    Console.WriteLine("objectArray[0] is null"); 
}

массива типов значений

Если вы знаете, массив, прежде чем руки, то вы можете использовать инициализацию указывала @clonked.
Для типов значений, как встроенные типы (как int, float, структуры и т.д., вам не нужно инициализировать каждый элемент массива.
Например, если вы создаете целочисленный массив,

int[] intArray = new int[3];

Тогда элементы массива intArray[0] до intArray[2] имеют memoery выделены и значения могут быть отнесены к ним.

intArray [0] = 1;

Проверьте GetData()

Таким образом, ваш метод GetData() должен включать в себя код, как это,

private MyArrObj[] GetData() 
{ 
    int numberOfObjects = GetNumberOfObjects(); // Get the number of objects at runtime 

    MyArrObj[] objectArray = new MyArrObj[numberOfObjects]; 

    for (int i = 0; i < numberOfObjects; i++) 
    { 
     objectArray[i] = new MyArrObj(); 
    } 

    return objectArray; 
} 



Дополнительная информация

Смежные вопросы