C# 明确定义对象时出现空引用异常

C# 明确定义对象时出现空引用异常,c#,sockets,unity3d,tcp,C#,Sockets,Unity3d,Tcp,我正在使用Unity和.NET创建TCP客户机-服务器关系 实际上,在我可以来回发送消息的地方,我的一切都在工作,但现在我遇到了一个NullReferenceException,这让我抓狂 我的统一代码中的TCPClientListener中有一个函数,它在每次更新()时调用ReadSocket public void SetupSocket(){ 套接字=新的TcpClient(主机、端口); stream=socket.GetStream(); writer=新的流writer(流); 读卡

我正在使用Unity和.NET创建TCP客户机-服务器关系

实际上,在我可以来回发送消息的地方,我的一切都在工作,但现在我遇到了一个NullReferenceException,这让我抓狂

我的统一代码中的TCPClientListener中有一个函数,它在每次更新()时调用ReadSocket

public void SetupSocket(){
套接字=新的TcpClient(主机、端口);
stream=socket.GetStream();
writer=新的流writer(流);
读卡器=新的流读卡器(流);
socketReady=true;
}
公共字符串ReadSocket(){
if(stream.DataAvailable){
返回“newdata!”+reader.ReadLine().Replace(“,”);
}
返回“”;
}
以上工作正常,没有问题。当服务器发送消息时,我接收到的消息很好。然后我添加了一个非常简单的if语句,现在我得到了关于reader的NullReferenceException

public string ReadSocket() {
        if (stream.DataAvailable) {
            if (reader.ReadLine().Contains("<EOF>"))
                return "New data! " + reader.ReadLine().Replace("<EOF>", "");
        }
        return "";
    }
公共字符串ReadSocket(){
if(stream.DataAvailable){
if(reader.ReadLine()包含(“”)
返回“newdata!”+reader.ReadLine().Replace(“,”);
}
返回“”;
}
我希望我只是看了太久,看不到明显的问题。为什么

if (reader.ReadLine().Contains("<EOF>"))
if(reader.ReadLine()包含(“”)

给我一个错误!?如果我删除它,没有错误。

直接的错误是你正在读两行。第二次读取似乎返回null。您可以通过应用标准的NRE调试技术找到这一点

另一个错误是您假设TCP保留了bessage边界。如果
DataAvailable>0
这并不意味着整行可用。可能只有一个字节可用。您可能会发现您的游戏意外阻塞


通常,最好是运行一个连续的读取循环,而不使用数据池。读吧。收到新行时,对其进行操作。

直接的错误是您正在阅读两行。第二次读取似乎返回null。您可以通过应用标准的NRE调试技术找到这一点

另一个错误是您假设TCP保留了bessage边界。如果
DataAvailable>0
这并不意味着整行可用。可能只有一个字节可用。您可能会发现您的游戏意外阻塞


通常,最好是运行一个连续的读取循环,而不使用数据池。读吧。收到新行时,对其进行操作。

直接的错误是您正在阅读两行。第二次读取似乎返回null。您可以通过应用标准的NRE调试技术找到这一点

另一个错误是您假设TCP保留了bessage边界。如果
DataAvailable>0
这并不意味着整行可用。可能只有一个字节可用。您可能会发现您的游戏意外阻塞


通常,最好是运行一个连续的读取循环,而不使用数据池。读吧。收到新行时,对其进行操作。

直接的错误是您正在阅读两行。第二次读取似乎返回null。您可以通过应用标准的NRE调试技术找到这一点

另一个错误是您假设TCP保留了bessage边界。如果
DataAvailable>0
这并不意味着整行可用。可能只有一个字节可用。您可能会发现您的游戏意外阻塞



通常,最好是运行一个连续的读取循环,而不使用数据池。读吧。当收到新行时,对其进行操作。

可能重复的可能重复的可能重复的可能重复的可能重复的Oh我明白了。我添加了字符串line=reader.ReadLine();谢谢另外,我在谷歌上找不到关于NRE.NRE=NullReferenceException/facepalm的任何信息,对吧
可能只有一个字节可用
这就是为什么我要检查DataAvailable=1且传入数据为“x”时会发生什么情况?然后在ReadLine调用中阻塞UI,直到字符串的其余部分进入。那可能需要很长时间。那我该怎么办?我猜只要继续读取数据,并将其构建成一个字符串,然后使用另一个循环(或同一个循环)来查看该字符串是否具有EOF?哦,我明白了。我添加了字符串line=reader.ReadLine();谢谢另外,我在谷歌上找不到关于NRE.NRE=NullReferenceException/facepalm的任何信息,对吧
可能只有一个字节可用
这就是为什么我要检查DataAvailable=1且传入数据为“x”时会发生什么情况?然后在ReadLine调用中阻塞UI,直到字符串的其余部分进入。那可能需要很长时间。那我该怎么办?我猜只要继续读取数据,并将其构建成一个字符串,然后使用另一个循环(或同一个循环)来查看该字符串是否具有EOF?哦,我明白了。我添加了字符串line=reader.ReadLine();谢谢另外,我在谷歌上找不到关于NRE.NRE=NullReferenceException/facepalm的任何信息,对吧
可能只有一个字节可用
这就是为什么我要检查DataAvailable=1且传入数据为“x”时会发生什么情况?然后在ReadLine调用中阻塞UI,直到字符串的其余部分进入。那可能需要很长时间。那我该怎么办?我猜只要继续读取数据,并将其构建成一个字符串,然后使用另一个循环(或同一个循环)来查看该字符串是否具有EOF?哦,我明白了。我添加了字符串line=reader.ReadLine();谢谢另外,我在谷歌上找不到关于NRE.NRE=NullReferenceException/facepalm的任何信息,对吧
可能只有一个字节可用
这就是为什么我要检查DataAvailable=1且传入数据为“x”时会发生什么情况?然后在ReadLine调用中阻塞UI,直到字符串的其余部分进入。那可能需要很长时间。那我该怎么办?我猜只要继续读取数据,并将其构建成字符串,然后
if (reader.ReadLine().Contains("<EOF>"))