Null Reference Exception when calling an Object Array

房东的猫 提交于 2019-12-18 05:26:07

问题


I tried to get some help earlier and I don't think I provided enough information though I appreciate all the advice.

The goal is simply to add a new instance of the Object Room to an array and print to a list box. When a user attempts to enter a room name that is already in existence it should simply display in the specs for the room that is already in the array.

I keep getting a null reference exception.

Here is my code:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;


namespace Room_Class
{
    public partial class Form1 : Form
    {
        Room[] roomArray = new Room[20];
        int count = 0;

        public Form1()
        {
            InitializeComponent();
        }

        private void btnAddRm_Click(object sender, EventArgs e)
        {
            double length, width, height;
            if (VerifyRoomName() == true)
            {


                if (txtRmLen.Text == "" || txtRmWid.Text == "" || txtRmHt.Text == "")
                {
                    for (int i = 0; i < roomArray.Length; i++)
                    {
                        if (txtRmName.Text == roomArray[i].getRoomName())
                        {
                            txtRmName.Text = roomArray[i].getRoomName();
                            txtRmLen.Text = roomArray[i].getLength().ToString();
                            txtRmHt.Text = roomArray[i].getCeilingHeight().ToString();
                            txtRmWid.Text = roomArray[i].getWidth().ToString();
                        }
                        else
                        {
                            roomArray[count] = new Room(roomName);
                            count++;
                        }
                    }
                }
                else
                {
                    try
                    {
                        length = double.Parse(txtRmLen.Text);
                        width = double.Parse(txtRmWid.Text);
                        height = double.Parse(txtRmHt.Text);
                        for (int i = 0; i < roomArray.Length; i++)
                        {
                            if (txtRmName.Text == roomArray[i].getRoomName())
                            {
                                txtRmName.Text = roomArray[i].getRoomName();
                                txtRmLen.Text = roomArray[i].getLength().ToString();
                                txtRmHt.Text = roomArray[i].getCeilingHeight().ToString();
                                txtRmWid.Text = roomArray[i].getWidth().ToString();
                            }
                            else
                            {
                                roomArray[count] = new Room(roomName, length, width, height);
                                count++;
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message + "\n\nPlease Enter Valid Values", "Error!");
                    }
                }  
                PrintList();
            }

        }


        private void PrintList()
        {
            double paintTotal = 0, feetTotal = 0;
            string RoomName;
            lstRoomList.Items.Clear();
            for (int i = 0; i < count; i++)
            {
                RoomName = roomArray[i].getRoomName() + "\t" + roomArray[i].SquareFeet().ToString("n1") + "\t" + roomArray[i].GallonsPaint().ToString("n1");
                lstRoomList.Items.Add(RoomName);
                paintTotal += roomArray[i].GallonsPaint();
                feetTotal += roomArray[i].SquareFeet();
                lblTtlGallons.Text = paintTotal.ToString("n1");
                lblTtlSqFt.Text = feetTotal.ToString("n1");
            }
        }

        private bool VerifyRoomName()
        {
            if (roomName == "")
            {
                MessageBox.Show("Please Enter a Room Name", "Error!");
                return false;
            }
            else
                return true;
        }
    }
}

回答1:


Your code should be

if (roomArray[i] != null)

Whenever you create an array, you'll have to initialize it's individual items before you can access them.

Room[] roomArray = new Room[20];

roomArray[0] = new Room();



回答2:


Because the elements of Room inside Room[] we're not initialized.

Try

public Form1()
{
    InitializeComponent();
    for(int i = 0; i < roomyArray.Length; i++) roomArray[i] = new Room();
}



回答3:


As the other answers have said, you need to initialize the array before you start using it. When you write:

Room[] roomArray = new Room[20];

What you are telling the computer to do is reserve you enough memory for references to 20 objects of the type Room. The other solutions proposed are fine, but if you want performance, try the following:

According to this SO answer, using the following function would be more performant than the other solutions provided thus far. This also has supporting evidence from this blog post.

Note: I've converted to use generics

    /// <summary>
    /// Fills an array with a default value
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="array">The array to fill with a default value</param>
    /// <param name="value">The default value</param>
    public static void MemSet<T>(T[] array, T value)
    {
        if (array == null)
        {
            throw new ArgumentNullException("array");
        }

        int block = 32, index = 0;
        int length = Math.Min(block, array.Length);

        //Fill the initial array
        while (index < length)
        {
            array[index++] = value;
        }

        length = array.Length;
        while (index < length)
        {
            Buffer.BlockCopy(array, 0, array, index, Math.Min(block, length - index));
            index += block;
            block *= 2;
        }
    }

Usage

Memset<Room>(roomArray, new Room());


来源:https://stackoverflow.com/questions/15102929/null-reference-exception-when-calling-an-object-array

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!