2017-09-03 50 views
-1

我試圖使用套接字將消息發送到電腦進行初始化,但我不斷收到此錯誤:的StreamWriter爲空,即使它在C#

System.NullReferenceException: 'Object reference not set to an instance of an object.'
sw was null.

這是我的代碼:

public partial class ServerGUI : Form 
{ 
    Socket soc; 
    StreamReader sr; 
    StreamWriter sw; 
    Stream s; 
    public ServerGUI() 
    { 
     InitializeComponent(); 
     try 
     { 
      if (Server.port == 0) 
      { } 
      else 
      { 
       textBox2.Text = Server.port.ToString(); 
      } 

     } 
     catch (Exception) { } 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     connect(); 
    } 
    void connect() 
    { 
     Server.port = int.Parse(textBox2.Text); 
     TcpListener listener = new TcpListener(IPAddress.Any, Server.port); 
     listener.Start(); 
     soc = listener.AcceptSocket(); 
     s = new NetworkStream(soc); 
     sr = new StreamReader(s); 
     sw = new StreamWriter(s); 
     sw.AutoFlush = true; // enable automatic flushing 
     if (soc.Connected == true) 
     { 
      Console.WriteLine("Connected"); 
      sw.WriteLine("Server Connected"); 
     } 
     this.Hide(); 
     Menu menu = new Menu(); 
     menu.Show(); 
    } 
    void recieve() 
    { 
     Console.WriteLine(sr.ReadLine()); 
    } 
    public void close() 
    { 
     s.Close(); 
     soc.Disconnect(true); 
     Menu menu = new Menu(); 
     menu.Close(); 
     this.Show(); 
    } 
    public void send(string msg) 
    { 
     sw.WriteLine(msg); 
    } 

這是按鈕的代碼:

ServerGUI sgui = new ServerGUI(); 
public Menu() 
{ 
    InitializeComponent(); 
} 

private void button1_Click(object sender, EventArgs e) 
{ 
    sgui.close(); 
} 

private void button2_Click(object sender, EventArgs e) 
{ 
    sgui.send(textBox1.Text); 
} 

的代碼的WriteLine在連接方法的作品,但在t時的代碼他發送方法沒有。我試過這個問題:What is a NullPointerException, and how do I fix it?但它沒有幫助我。 感謝

+2

告訴你如何調用'send'和'connect'。並且,你調試了嗎?.. –

+3

如果你真的不能追蹤其他問題和答案的空指針,你需要提供一個[mcve]。只是向我們展示了兩個片段,並向我們保證該程序的結構正確以確保沒有空值是不夠的(尤其是因爲,如果情況如此,則不會有空引用 - 顯然,您的假設目前不正確) –

+0

你在哪裏叫'發送'? –

回答

1

如果send方法是connect方法的StreamWritersw設置爲null之前調用和NullReferenceExceptionsend方法內拋出。

一個快速的解決辦法是使用它像之前檢查sw屬性:

public void send(string msg) 
{ 
    if (sw != null) 
     sw.WriteLine(msg); 
} 

或用較新的C#語言功能有點短:

public void send(string msg) 
{ 
    sw?.WriteLine(msg); 
} 

編輯:

問題是,在ServerGUI sgui = new ServerGUI();這一行中,在隱藏了自己的之後,創建了一個新的(第二個)表單:財產。此sw屬性從未初始化,因爲創建的StreamWriter實例是您剛剛隱藏的第一個gui的一部分。

儘管這種設計(沒有數據/服務層的表單的強耦合)並不理想,但解決此問題的一種方法是將表單實例傳遞給Menu。例如。

var menu = new Menu(); 
menu.ServerGui = this; 
menu.Show(); 

,當然還有Menu類有引入ServerGUI屬性,例如公共

class Menu { 
    ... 
    public ServerGUI ServerGui {get; set;} 

    private void button1_Click(object sender, EventArgs e) 
    { 
     ServerGui.close(); 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     ServerGui.send(textBox1.Text); 
    } 
+0

即停止了該錯誤,但仍不會發送。所以這就是我的程序的工作原理:ServerGUI表單上有一個名爲button1的按鈕。當你按下它時,它連接到客戶端。連接後,它將關閉ServerGUI並打開菜單表單。在菜單窗體上,有兩個按鈕和一個文本框。 Button1與客戶端斷開連接(我從不按下,所以不能成爲問題,我也嘗試刪除代碼,但沒有修復它),button2調用send方法。 – TheTrialBot

+0

@TheTrialBot - 我編輯瞭解決主要問題的答案,即您正在使用兩個ServerGUI實例。 –

+0

是的,這工作!謝謝。我一直試圖讓它現在工作一段時間。 – TheTrialBot

相關問題