2015-01-26 4 views
-1

В следующем коде я получаю ошибку нулевой ссылки в первой строке в моем окончательном заявлении - счет-фактура [x] .IdNumber = idResult; как он может дать мне нулевую ссылку, когда я пытаюсь присвоить ей значение?Необработанное исключение типа «System.NullReferenceException», происходящее

class Program 
    { 
     static void Main(string[] args) 
     { 
      const int theConst = 999; 
      Invoice[] invoice = new Invoice[5]; 
      int x; 
      int idResult = 999; 
      int dayResult = 1; 
      double dResult = 0.0; 
      string checker; 
      for (x = 0; x < invoice.Length; ++x) //for loop to instantiate objects and obtain data 
      { 
       try 
       { 
        Console.Write("Enter invoice number "); 
        checker = Console.ReadLine(); 
        if (int.TryParse(checker, out idResult)) 
        { 
         idResult = Convert.ToInt32(checker); 
        } 
        else 
        { 
         idResult = theConst; 
        } 


       Console.Write("Enter balance "); 
       checker = Console.ReadLine(); 
       if (double.TryParse(checker, out dResult)) 
       { 
        dResult = Convert.ToDouble(checker); 
       } 
       else 
       { 
        dResult = 0.0; 
       } 
       Console.Write("Enter due day "); 
       checker = Console.ReadLine(); 
       if (int.TryParse(checker, out dayResult)) 
       { 
        dayResult = Convert.ToInt32(checker); 
       } 
       else 
       { 
        dayResult = 1; 
       } 
       invoice[x] = new Invoice(idResult, dResult, dayResult); 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine("enters catch x is " + x); 
       idResult = theConst; 
       dResult = 0.0; 
       dayResult = 1; 
       Console.WriteLine(ex.Message + "default value will be used"); 
      } 
      finally 
      { 
       invoice[x].IdNumber = idResult; 
       invoice[x].BalanceDue = dResult; 
       invoice[x].DayDue = dayResult; 
      } 

     } 
     Console.WriteLine("Entered Invoices: " + Environment.NewLine); 
     for (x = 0; x < invoice.Length; ++x) //first display 
     { 
      Console.Write("#" + invoice[x].IdNumber + " $" + invoice[x].BalanceDue + " day " + invoice[x].DayDue + "\n"); 
     } 
     Console.Read(); 
    } 
} 
class Invoice 
{ 
    private int idNumber; 
    public int IdNumber 
    { 
     get 
     { 
      return idNumber; 
     } 
     set 
     { 
      idNumber = value; 

     } 
    } 
    private double balanceDue; 
    public double BalanceDue 
    { 
     get 
     { 
      return balanceDue; 
     } 
     set 
     { 
      balanceDue = value; 
     } 
    } 
    private int dayDue; 
    public int DayDue 
    { 
     get 
     { 
      return dayDue; 
     } 
     set 
     { 
      dayDue = value; 

     } 
    } 
    public Invoice(int num, double balance, int daydue) 
    { 
     IdNumber = num; 
     BalanceDue = balance; 
     DayDue = daydue; 
     Console.WriteLine(num + " " + balance + " " + daydue); 
     if (daydue < 1 || daydue > 31) 
     { 

      throw new ArgumentException("Day must be between 1-31 "); 
     } 
     if (num < 100 || num > 999) 
     { 
      throw new ArgumentException("ID number must be between 100-999 "); 
     } 
    } 
    public Invoice() : this(999, 0, 1) { } 
} 

}

+0

Я не знаю, почему некоторые из моего кода не форматировали правильно, пожалуйста, помогите. –

ответ

0

Эта ошибка будет происходить только во время выполнения, когда исключение в вашей примерке блоке, прежде чем объект инициализируется: то есть счет-фактура [х] = новый счет-фактура (...); Таким образом, ошибка не появляется, если блок try выполняется без исключения исключения. Имейте в виду, что код в «finally» выполняется, если ошибка возникает или нет.

Что вам нужно сделать, это инициализировать 5 объектов в вашем массиве объектов-фактур.

Включите эту опцию:

for (int z=0; z < invoice.Length; z++) 
       invoice[z] = new Invoice(idResult,dResult,dayResult); 

перед входом в ваш для цикла. В противном случае объект не инициализируется, и поэтому он не имеет свойств.

Это может быть одно из возможных более простых решений.

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