2017-01-21 2 views
0

Я получаю NullReferenceException на линии:Обращение с NullReferenceException в C#

элементов [размер] = имя; // Эта строка находится на полпути через код в функции вставки.

Я понимаю, почему я получаю его, но как мне его обрабатывать?

using System; 
    using System.IO; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Text; 
    using System.Threading.Tasks; 

    namespace IP01 
    { 
    public class Program 
    { 
    public class MinHeap 
    { 
     static string[] items; 
     int size = 0; 

     static void Main(string[] args) 
     { 
      string[] array = new string[5] { "f", "a", "c", "d", "e" }; 

      Console.Write("Original Array: "); 
      for (int i = 0; i < array.Length; i++) 
       Console.Write(" " + array[i]); 
      Console.WriteLine(); 

      MinHeap heap = new MinHeap(); 
      heap.createHeap(array); 
      heap.sort(); 

      Console.Write("Sorted Array: "); 
      for (int i = 0; i < items.Length; i++) 
       Console.Write(" " + items[i]); 
      Console.WriteLine(); 
     } 



     public void createHeap(string[] array) 
     { 
      if (array.Length > 0) 
      { 
       for (int i = 0; i < array.Length; i++) 
        insert(array[i]); 
      } 
     } 

     public void rebuild(int rootIndex, int n) 
     { 
      int max = 2 * rootIndex + 1; 
      bool larger; 
      int less = string.Compare(items[max], items[max + 1]); 

      if (less < 0) 
       larger = true; 
      else 
       larger = false; 

      bool larger2; 
      int less2 = string.Compare(items[rootIndex], items[max]); 

      if (less2 < 0) 
       larger2 = true; 
      else 
       larger2 = false; 

      if ((2 * rootIndex + 1) < n) 
      { 

       if ((2 * rootIndex + 2) < n) 
       { 
        max = larger ? max + 1 : max; 
       } 

       if (larger2) 
       { 
        string temp; 

        temp = items[rootIndex]; 
        items[rootIndex] = items[max]; 
        items[max] = temp; 

        rebuild(max, n); 
       } 
      } 
     } 

     public void Heap() 
     { 
      size = 0; 
     } 

     public bool isEmpty() 
     { 
      return size == 0; 
     } 

     public void insert(string name) 
     { 
      int child; 
      int parent; 

      items[size] = name; 
      child = size; 
      parent = (child - 1)/2; 

      bool larger3; 
      int less3 = string.Compare(items[parent], items[child]); 

      if (less3 < 0) 
       larger3 = true; 
      else 
       larger3 = false; 

      while (parent >= 0 && larger3) 
      { 
       string temp; 
       temp = items[child]; 
       items[child] = items[parent]; 
       items[parent] = temp; 

       child = parent; 

       parent = (child - 1)/2; 
      } 

      size++; 
     } 

     public void remove() 
     { 
      if (size == 0) 
      { 
       Console.Write("The heap is empty. No object removed.\n"); 
      } 
      else 
      { 
       items[0] = items[size - 1]; 
       size--; 

       rebuild(0, size); 
      } 
     } 

     public void sort() 
     { 
      for (int i = size - 1; i >= 0; i--) 
      { 
       rebuild(i, size); 
      } 

      int last = size - 1; 

      for (int i = 1; i <= size; i++) 
      { 
       string temp; 

       temp = items[0]; 
       items[0] = items[last]; 
       items[last] = temp; 

       last--; 

       rebuild(0, last); 
      } 
     } 
    } 
} 

}

+0

Читайте на 'try-catch'? –

+1

Вы не должны сбросить весь свой код и ожидать, что мы рассмотрим все это, чтобы определить проблему. При этом я не вижу нигде в вашем коде, где вы фактически инициализируете «элементы». – Abion47

+0

Пожалуйста, перечитайте [MCVE] руководство по отправке кода, чтобы улучшить ваши будущие вопросы. –

ответ

2

Вы не инициализирован свой массив. попробуй это. Может быть, это может вам помочь.

items=new string[]{""}; 
items[size] = name; 
+0

Это исправило ошибку. Благодаря! Однако теперь одна и та же строка говорит, что исключение IndexOutOfRangeException не обрабатывается. – Leslie

+0

вы использовали отметки quotaion во время инициализации или нет? – kritikaTalwar

+0

Да. Я использовал именно то, что вы написали. – Leslie