2015-06-06 2 views
0

Работа над программой для класса, и я почти на 95% заполнен, но столкнулся с блокпостом. У меня есть класс Flight, который содержит информацию о полете, а также график сидения. Используя окно формы окна, выберите объекты полета, которые я создал, прочитав из текстового файла. Я могу получить значения для каждого свойства из объекта класса, кроме одного, SeatChart.Не могу понять, почему ссылка на объект равна нулю

Вот уместен код в основной программе:

private void lstFlights_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     curFlight = (Flight)lstFlights.SelectedItem; 
     DisplayNewFlightChart(); 
    } 

    private void DisplayNewFlightChart() 
    { 

     int seats = curFlight.Rows * curFlight.Seats; 
     lstSeatingChart.Items.Clear(); 
     string[] seatChart = curFlight.SeatChart; 
     for (int x = 0; x <= seats; x++) 
     { 
      lstSeatingChart.Items.Add("Seat " + (x + 1) + " " + seatChart[x]); 
     } 
    } 

А вот код из класса:

class Flight 
{ 
    private string mPlane; 
    private string mDepartureTime; 
    private string mDestination; 
    private int mRows; 
    private int mSeats; 
    private string[] mSeatChart; 

    public Flight() 
    { 
    } 

    // Create the overloaded Constructor 
    public Flight(string planeType, string departureTime, 
        string destination, int numRows, 
        int numSeatsPerRow) 
    { 
     this.Plane = planeType; 
     this.DepartureTime = departureTime; 
     this.Destination = destination; 
     this.Rows = numRows; 
     this.Seats = numSeatsPerRow; 
     this.SeatChart = mSeatChart; 


     mSeatChart = new string[Rows * Seats]; 

     for (int seat = 0; seat <= mSeatChart.GetUpperBound(0); seat++) 
     { 
      mSeatChart[seat] = "Open"; 
     } 



    } 

    public string Plane 
    { 
     get { return mPlane; } 
     set { mPlane = value; } 
    } 

    public string DepartureTime 
    { 
     get { return mDepartureTime; } 
     set { mDepartureTime = value; } 
    } 

    public string Destination 
    { 
     get { return mDestination; } 
     set { mDestination = value; } 
    } 

    public int Rows 
    { 
     get { return mRows; } 
     set { mRows = value; } 
    } 

    public int Seats 
    { 
     get { return mSeats; } 
     set { mSeats = value; } 
    } 

    public string[] SeatChart 
    { 
     get { return mSeatChart; } 
     set { mSeatChart = value; } 
    } 

    public void MakeReservation(string passName, int seat) 
    { 
     bool seatTaken = false; 
     if (mSeatChart[seat] != "Open") seatTaken = true; 

     if (passName != "" && seatTaken == false) 
     { 
      mSeatChart[seat] = passName; 
     } 
     else 
     { 
      MessageBox.Show("Please Enter a Passenger Name, in an unreserved seat"); 
     } 

    } 

Это говорит мне curFlight.SeatChart пустое, даже если я могу pull .Rows и .Seats from curFlight просто отлично. Я не знаю, почему .SeatChart испортил. lstFlights - список объектов полета, извлеченных из текстового файла, и lstSeatingChart - это место, где я хочу отображать список мест.

+0

Я искренне надеюсь, что это не производственный код. добавьте это в 'public Flight() {this.mSeatChart = новая строка [1]; } ' – zaitsman

+1

Можете ли вы предоставить стек? –

+0

Ссылка на объект не указывает на экземпляр объекта System.NullReferenceException на WindowsFOrmasAPplication3.Reservations.DisplayNewFlightCHart() в D: \ Users \ Nathan \ Desktop \ C# Проекты \ program4 \ windowsformsappliocation3 \ Form1.cs: строка 76 – Ozmethod

ответ

3

Вы устанавливаете SeatChart в mSeatChart, который в это время является нулевым. Поэтому для этого не делается ссылки на объект. SeatChart.

После этого вы инициализируете mSeatChart и заполняете его.

Вы должны переместить настройку this.SeatChart после инициализации mSeatChart.

mSeatChart = new string[Rows * Seats]; 
this.SeatChart = mSeatChart; 

Edit: Кроме того, SeatChart является собственностью и mSeatChart является переменной-члена. SeatChart будет использоваться для демонстрации mSeatChart, поэтому очень сложно установить SeatChart с помощью mSeatChart. Настолько странно, что я даже не думал, что вы это делаете. Так что в вашем случае оставьте следующие в конструкторе:

this.SeatChart = mSeatChart; 

Я думаю, что истинная причина вашей проблемы где-то еще в коде, где вы начать полет и заполнить список. Если я правильно понимаю, вы получаете ошибку нулевой ссылки на конкатенацию в цикле for?

string[] seatChart = curFlight.SeatChart; 
    for (int x = 0; x <= seats; x++) 
    { 
     lstSeatingChart.Items.Add("Seat " + (x + 1) + " " + seatChart[x]); 
    } 

Проверьте, где вы начинаете каждый объект полета. Бьюсь об заклад, вы используете пустой конструктор: new Flight() Удалите пустой конструктор, потому что вы не ожидаете пустых значений. И если вам действительно нужен пустой конструктор, то либо инициируйте все переменные-члены, как ожидалось, либо выполните нулевую проверку, где бы вы их ни использовали.

И как только вы нашли причину, убедитесь, что вы измените цикл для

for (int x = 0; x < seats; x++) 

, так как вы проверкой количества мест и сделать цикл с отсчетом от нуля. Если x = места, вы бы выполнили петлевые сидения + 1 раз (ряды * места + 1).

+0

либо thi s или, как упоминалось выше, @zaitsman, добавьте инициализацию сидения в конструктор по умолчанию – Chrisi

+1

Поскольку SeatChart должен иметь количество элементов, равное строкам * Сиденья, инициализирующие сначала строку [1], не помогут: OP не получит нулевой ссылкой, но получит неправильный строковый массив с 1 элементом. – Dacker

+1

@ Dacker3 сделал некоторые тесты, и вы правы. Я думаю, что лучший способ - не трогать это.SeatChart вообще в конструкторе, так как свойство делает поле доступным в любом случае – Chrisi

0

Если ваш код зависит от того, какое конкретное свойство никогда не является нулевым, вам необходимо убедиться, что он инициализирован во всех конструкторах.

Основываясь на логике вашего класса, я бы предложил, чтобы у вас не было конструктора с меньшим значением. Не имеет смысла иметь полет, у которого не было определенного количества мест (по крайней мере, в вашей реализации).

Также некоторые вещи стиля.

Вам не нужно объявлять свои частные переменные экземпляра. Просто используйте

public string destination {get; set;} 

Объявите «открытым» как константу класса и используйте эту константу, а не строгое строковое значение.

+0

Спасибо за советы по стилю, я их замечу. – Ozmethod

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