2013-02-27 6 views
0

이전에 도움을 얻으려고했으나 모든 정보를 제공했지만 충분한 정보를 제공하지 못했습니다.오브젝트 배열을 호출 할 때 널 참조 예외가 발생했습니다.

목적은 개체 방의 새 인스턴스를 배열에 추가하고 목록 상자에 인쇄하는 것입니다. 사용자가 이미 존재하는 방 이름을 입력하려고하면 이미 배열에있는 방의 사양에 표시되어야합니다.

null 참조 예외가 계속 발생합니다.

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; 
     } 
    } 
} 
+0

roomName –

+0

예외 어디 무엇을 사용하도록 변환 한? – John3136

+2

스택 오버플로에 오신 것을 환영합니다! 'NullReferenceException'의 거의 모든 경우는 같습니다. 일부 힌트는 "[.NET의 NullReferenceException은 무엇입니까?] (http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-in-net)"를 참조하십시오. –

답변

2

귀하의 코드가

if (roomArray[i] != null) 

당신이 배열을 만들 때마다, 당신은 당신이 그들에 액세스 할 수 있습니다 전에 개별 항목의 초기화해야해야한다 :

여기 내 코드입니다.

Room[] roomArray = new Room[20]; 

roomArray[0] = new Room(); 
+0

는 거의 같은 답을 주려고했지만 OP가이 부분의 roomArray [room]에 새 룸 (roomName);을 // 초기화한다는 것을 알았습니다. // 다른 부분은 의심 스럽지만 – exexzian

+0

@Bingo Yeah 나는 그것도 보았다 ... 나는 그의 가장 큰 문제는 아마도 배열을 일반적으로 사용하는 방법을 이해하고있는 것으로 생각된다. 그러므로 나의 대답은 :) – scartag

3

Room [] 안에있는 방의 요소가 초기화되지 않았기 때문에.

는 다른 답변이 말했듯이, 당신은 당신이 그것을 사용하기 전에 배열을 초기화 할 필요가

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

보십시오. 당신이 쓸 때 :

당신이 컴퓨터를 말하는 무엇
Room[] roomArray = new Room[20]; 

는 유형 Room 20 개체에 대한 예비 당신에게 충분한 메모리입니다. 제안 된 다른 솔루션은 문제가 없지만 성능을 원할 경우 다음을 시도하십시오.

this 대답에 따르면 다음 기능을 사용하면 지금까지 제공되는 다른 솔루션보다 성능이 우수합니다. this blog post.

주에서이 또한 지원 한 증거 : 나는 제네릭

/// <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; 
     } 
    } 

사용

Memset<Room>(roomArray, new Room()); 
관련 문제