我遇到System.NullReferenceException的一些问题。当服务器做的事情,我们首先检查用户是否为空,然后他断开连接和服务器进展的东西,并尝试获取用户来System.NullReferenceException。我有超过20 000行代码,所以我需要一些小东西,不是总是检查它是否为空。我的服务器是多线程所以套接字连接和断开用户在背景上的所有时间这就是为什么这来..我想要停止进展当用户断开连接。如果我到处都是“尝试/捕获”是那个好道路?
示例:
if (User != null)
{
//do some things
System.Threading.Thread.Sleep(1000); //now we have time disconnect (This only for get error)
User.SendMessage("crash"); //<-- System.NullReferenceException... -.-
}
答案 0 :(得分:3)
看起来User
的值在测试后但在调用SendMessage
之前发生了变化。如果您的应用程序是多线程的,我怀疑另一个线程在您睡觉时将User
设置为null。
一种选择是抓住User
并对其进行检查:
var user = User;
if (user != null)
{
//do some things
System.Threading.Thread.Sleep(1000);get error)
user.SendMessage("crash"); // Need to be sure user is in a valid state to make call
}
这样你可以确定你有一个有效的参考。您现在需要做的是确保user
处于有效状态,以便您拨打SendMessage
。
更新:由于你不断添加try / catch块,你可以写一个辅助函数:
void WithUser(Action<User> action)
{
try
{
var user = User;
if (user != null) action(user);
}
catch(Exception e)
{
// Log it...
}
}
现在你可以说:
WithUser(user=>
{
System.Threading.Thread.Sleep(1000);
user.SendMessage("crash");
});
答案 1 :(得分:0)
SendMessage
抛出null异常,检查SendMessage
方法
如果User
在调用之前变为null,则不要调用SendMessage: -
if (User != null)
{
User.SendMessage("crash"); //<-- No More System.NullReferenceException... -.-
}
答案 2 :(得分:0)
谁将User
设为null并在哪里?当你的线程休眠时,有人显然将User变量设置为null,从而导致崩溃。
此外:“神奇的睡眠”不会解决任何问题。你需要在这里正确锁定。