对象引用未设置c#

时间:2017-07-27 18:59:38

标签: c# object tcp reference null

我已经创建了一个通过第二个应用程序TCP进行通信的应用程序,但是我收到错误:

  

System.NullReferenceException:'对象引用未设置为对象的实例。' - > s在while循环中为null。

只有在我强行关闭第二个应用程序时(通过按应用程序顶部的X或通过任务管理器将其终止)仍然与第一个应用程序连接,才会出现此错误。

我的第一个接收命令并将其打印出来的应用程序:

try
{
    StreamReader reader = new StreamReader(client.GetStream());
    StreamWriter writer = new StreamWriter(client.GetStream());
    string s = String.Empty;
    while (!(s = reader.ReadLine()).Equals("PING"))
        Console.WriteLine(s);
    reader.Close();
    writer.Close();
    client.Close();
}
catch (IOException)
{
    Console.WriteLine("woops an error!");
}

我发送命令的第二个应用程序:

try
{
    TcpClient client = new TcpClient("192.168.0.107", 8080);
    StreamReader reader = new StreamReader(client.GetStream());
    StreamWriter writer = new StreamWriter(client.GetStream());
    writer.WriteLine("PING");
    writer.Flush();
    reader.Close();
    writer.Close();
    client.Close();
}catch(Exception ex)
    Console.WriteLine(ex.Message);

我试过检查s == null(如下所示),但仍然会抛出异常。

while (!(s = reader.ReadLine()).Equals("PING") || (s==null))

1 个答案:

答案 0 :(得分:3)

如果reader.ReadLine()返回null,则将为s分配null,然后您立即调用null上的.Equals(任何赋值会自动返回已分配的值).. s == null没有什么可以阻止这一点,事实上它不能;将它交换到左边不会有任何帮助,因为括号优先 - 你需要在调用它之前将其检查为null.Equals on it

你最好不要使用for循环而不是在一个语句中尝试这么做

for(s = reader.ReadLine(); s!=null && s.Equals("PING"); s = reader.ReadLine())