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

代码检查:ConcurrentDict犯规阻止项目为空的循环中

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异常。

我该如何预防?我使用一个Concurrent Dictionary和一个高度多线程的服务器架构。

+2

究竟是什么?你看过调试器吗? – SLaks

+0

你可以发布你的空检查的代码? –

+1

您需要向我们显示失败的空检查代码 – Sean

回答

0

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

+0

不,如我所说,Charr itselfe为空。我在调试时进行了检查(鼠标悬停在charr上 - 显示为空) – Yuki

+0

我没有看到Charr如何获得null,因为它是一个不受其他线程影响的堆栈变量。但是,如果你将它作为一个成员变量,它当然可以被其他线程改变,并且没有并发列表将会处理这个问题。 –

1

这个问题提到你检查null,但目前还不清楚你在做哪个值。考虑在这种情况下下面的代码

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

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

+0

哈哈的确,那我是怎么做的呢,当我说我检查了它是否为空。它有时甚至是空的! – Yuki

+0

@Yuki这不可能阻止CLR本身的错误。 – JaredPar