为什么会出现NullReferenceException?

时间:2014-01-04 22:29:09

标签: c# devexpress nullreferenceexception

我有以下代码:

try {
    using (var stream = new MemoryStream()) {
        var ms = stream;
        if (control is DockLayoutManager) {
            if (control.Dispatcher == null || control.Dispatcher.CheckAccess()) {
                ((DockLayoutManager)control).SaveLayoutToStream(ms);
            } 
        }
    }
} catch (Exception e) {
    log.Error(string.Format("Cannot GetLayout ({0}).", typeName), e);
}

我不时会在行

上得到NullReferenceException
((DockLayoutManager)control).SaveLayoutToStream(ms);

我不知道为什么在这一行上会出现NullReferenceException。

我希望,有人可以帮助我。

3 个答案:

答案 0 :(得分:4)

问题出在.SaveLayoutToStream(ms)

之前发生了好几次:

https://www.devexpress.com/Support/Center/Question/Details/B190607 http://www.devexpress.com/Support/Center/Question/Details/B221485 https://www.devexpress.com/Support/Center/Question/Details/Q445171

如果您有源代码,那么我会将它们链接到解决方案中,重建并在失败时进行跟踪。另外,我要确保我的源/二进制文件是完全最新的。

如果你不这样做,那么调试它将会非常困难。 DevExpress表示他们不希望将代码放在适当的位置,以便能够确定准确的原因。此外,编译器抛出该行的原因仅仅是它没有有任何进一步的源代码行指向您,它发生在该方法内。在这种情况下,请联系DevExpress询问他们的情况。

似乎是一个序列化问题。 B221485问题编号似乎表明具有类型为DefaultBoolean的属性的控件被设置为-1并随后爆炸。支持人员说要将您要设置此类属性的任何属性定位到truefalse,作为修复内容的指标。看起来很奇怪。

答案 1 :(得分:1)

如果此代码表现得像显而易见,则此行不能抛出nullref。还有其他事情正在发生。在那里放置一个断点并观察运行时行为。

思路:

  1. control.Dispatcher.CheckAccess中的某些内容可以将control设置为null。那确实是可怕的代码。
  2. 这是一个线程错误(种族)。
  3. 过时的源文件。重建解决方案。
  4. SaveLayoutToStream内部的东西扔了,你错误地解释了位置异常。查看堆栈跟踪以找出答案。将调试器设置为中断异常(Ctrl-Alt-E)。

答案 2 :(得分:0)

对我来说看起来像是竞争条件,例如:在if检查之后,某些东西改变了控制。

顺便说一下,建议做以下的事情:

var dockLayoutManager = control as DockLayoutManager;

if (dockLayoutManager != null) {
        if (dockLayoutManager.Dispatcher == null || dockLayoutManager.Dispatcher.CheckAccess()) {
            dockLayoutManager.SaveLayoutToStream(ms);
        } 
    }

所以你不必投两次。