2017-09-03 72 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