我已经创建了一个通过第二个应用程序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))
答案 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())