0
foreach (KeyValuePair<uint, Character> kvp in World.AllChars)
{
    Character Charr = kvp.Value;
    Charr.Do(); <-- NullrefException: Charr is null
}

带支票的代码:

foreach (KeyValuePair<uint, Character> kvp in World.AllChars)
{
    Character Charr = kvp.Value;
    if(Charr != null)
    {
       Charr.Do(); <-- NullrefException: Charr is null
    }
}

编辑:

Do() 中的任何内容都不会导致它为空,因为它甚至无法执行 Do(),因为 Charr 为空。

这就是我的循环的样子。我已经尝试过进行 if != null 检查,但它仍然超出了检查范围并引发了 nullref 异常。

我怎样才能防止这种情况?我使用并发字典和高度多线程的服务器架构。

4

2 回答 2

1

该问题提到您检查null但不清楚您正在执行哪个值。考虑以下代码

Character Charr = kvp.Value;
if (Charr != null) { 
  Charr.Do();
}

在这种情况下是不可能CharnullCharr有可能是 is的成员,null因此该Do方法会抛出。如果是这种情况,尽管该Character类型可能不适合多线程场景(至少它们的使用方式)

于 2014-01-20T14:39:45.587 回答
0

如果您添加了对 Charr 的空检查,但仍然得到空引用异常,则Do()方法中的某些内容将导致此异常。检查异常的调用堆栈或/并使用调试器逐步检查您的代码。

于 2014-01-20T14:33:02.813 回答