2015-06-06 68 views
0

正在爲一個類的程序工作,並且已完成約95%,但遇到了障礙。我有一個飛行班,裏面有關於飛行的信息,還有座位圖。使用Windows窗體列表框從我通過從文本文件讀取創建的飛行對象中進行選擇。我可以從類對象的每個屬性中獲取值,除了一個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爲空,即使我可以從curFlight中拉出.Rows和.Seats就好了。我不知道爲什麼.SeatChart搞亂了。 lstFlights是從文本文件中拉出的飛行物體列表,lstSeatingChart是我想要顯示座位列表的位置。

+0

我真誠希望這不是一個生產代碼。將此添加到'公共Flight(){this.mSeatChart = new string [1]; }' – zaitsman

+1

你能提供堆棧跟蹤嗎? –

+0

對象參考不WindowsFOrmasAPplication3.Reservations.DisplayNewFlightCHart()在 d設置爲一個對象 System.NullReferenceException 的一個實例:\ Users \用戶森\桌面\ C# 項目\ program4 \ windowsformsappliocation3 \ Form1.cs中:行76 – Ozmethod

回答

3

您正在將SeatChart設置爲當時爲null的mSeatChart。所以沒有對這個對象進行引用.SeatChart。

之後,您初始化mSeatChart並填寫它。

您應該在初始化mSeatChart之後移動設置this.SeatChart。

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

編輯: 此外,SeatChart該場所mSeatChart是成員變量。 SeatChart將用於公開mSeatChart,因此使用mSeatChart設置SeatChart真的很奇怪。很奇怪,我甚至沒有想到你會這麼做。 所以你的情況離開下列出在構造函數中:

this.SeatChart = mSeatChart; 

我覺得你的問題的真正原因是其他地方的代碼,其中您開始飛行,並填寫列表。如果我理解正確,你會得到for循環中的串聯空引用錯誤?

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

檢查您啓動每個Flight對象的位置。我敢打賭,你正在使用空的構造函數:new Flight() 刪除空的構造函數,因爲你顯然不期望空值。如果你確實需要空的構造函數,那麼或者按照預期啓動所有成員變量,或者在你想要使用它們的地方執行空檢查。

而且一旦你找到了原因,確認你,因爲你是檢查座位數爲循環改變到

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

,做一個從零開始的循環。如果x =座位,您將執行循環座位+ 1次(行*座位+ 1)。

+0

要麼s或像@zaitsman提到的那樣,將座位圖初始化添加到默認構造函數 – Chrisi

+1

由於SeatChart必須包含與行數相等的項目*座位首先初始化爲字符串[1]將無濟於事:OP將無法獲得一個空引用了,但會得到1個元素的錯誤字符串數組。 – Dacker

+1

@ Dacker3做了一些測試,你是對的。我認爲最好的辦法就是不要碰這個.SeatChart完全可以在構造函數中使用,因爲該屬性使得該字段可用。無論如何 – Chrisi

0

如果你的代碼依賴於一個從不爲空的特定屬性,你需要確保它在所有的構造函數中被初始化。

基於你的類的邏輯,我建議你不應該有一個參數少的構造函數。沒有已知數量的座位的航班沒有意義(至少在您的實施中)。

還有一些風格的東西。

你不需要聲明你的私有實例變量。只需使用

public string destination {get; set;} 

聲明「open」作爲類常量,並使用該常量而不是硬編碼字符串值。

+0

感謝風格提示,我會記下它們。 – Ozmethod

相關問題