我创建了一个通过第二个应用程序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))
如果是读者。ReadLine(( 返回 null,null 将被分配给 s,然后您将立即调用 .等于空值(任何赋值都会自动返回分配的值(。S == null 不会阻止这种情况,实际上它不能;将其交换到左侧也无济于事,因为括号优先 - 您需要在调用 .等于它
你最好使用 for 循环,而不是试图在一个语句中做这么多
for(s = reader.ReadLine(); s!=null && s.Equals("PING"); s = reader.ReadLine())