类型' System.NullReferenceException'的未处理异常发生

时间:2015-01-26 01:02:49

标签: c# object try-catch nullreferenceexception

在下面的代码中,我在finally语句的第一行得到了空引用错误 - invoice [x] .IdNumber = idResult;当我尝试为它赋值时,它如何给我一个空引用?

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) { }
}

}

1 个答案:

答案 0 :(得分:0)

只有在初始化对象之前在try-block中抛出异常时,才会在运行时发生此错误:即invoice [x] = new Invoice(...); 因此,如果try-block执行而不抛出异常,则不会出现错误。请记住,“finally”中的代码是在发生错误时执行的。

您应该做的是初始化Invoice对象数组中的5个对象。

包括这个:

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

在进入for循环之前。否则,对象未初始化,因此它没有属性。

这可能是一种可能更简单的解决方案。