2017-07-27 40 views
0

我做了经第二应用TCP通信的应用程序,我得到一个错误:对象未设置C#

System.NullReferenceException: 'Object reference not set to an instance of an object.' --> s was null at the while loop.

只有当我强行关闭第二个应用程序(通过按下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

的可能的复制[什么是一个NullReferenceException,如何解决呢?(https://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-我的修复程序) – Filburt

+0

您的streamreader取决于您的客户端对象,当第二个应用程序断开连接时它会被处置,只需添加一些错误处理即可。 – ConnorLSW

+0

您在调用'Equals'方法 –

回答

3

如果reader.ReadLine()返回NULL,NULL将被分配到秒,然后你会马上打电话给.Equals对空(任何任务自动返回分配的值)..在S = = null没有做任何事情来防止这一点,事实上它不能;将它交换到左边也不会有帮助,因为括号优先 - 您需要在调用之前检查它是否为空。等于它

您最好使用for循环而不要尝试这样做多在一个声明中

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

+1之后执行的第二项检查's == null'因为它没有在一个语句中做太多的事情。我认为OP最终造成了他或她自己的困惑。 – KSib

+0

我也不喜欢在单一行中做一件巨大的事情。这会让你自己和其他需要维护代码的人感到困惑。 – JuanR

相关问题