这段代码如何抛出NullReferenceException?

时间:2009-05-08 01:26:18

标签: c# nunit

我必须忘记,因为我的单元测试失败,因为以下代码抛出了空引用异常:

int pid = 0;
if (parentCategory != null)
{
    Console.WriteLine(parentCategory.Id);
    pid = parentCategory.Id;
}

投掷它的线是:

pid = parentCategory.Id;

console.writeline只是在NUnit GUI中调试,但输出有效的int。

编辑:它是单线程的,因此无法从其他某个线程分配给null,而且Console.WriteLine成功打印出该值的事实表明它不应该抛出

编辑:类别类的相关摘要:

public class Category
{
    private readonly int id;

    public Category(Category parent, int id)
    {
        Parent = parent;
        parent.PerformIfNotNull(() => parent.subcategories.AddIfNew(this));
        Name = string.Empty;
        this.id = id;
    }
    public int Id
    {
        get { return id; }
    }
}

如果有人想查看完整代码,请访问Google代码http://code.google.com/p/chefbook/source/checkout

我想我会尝试重新启动计算机......我看到很多奇怪的东西都是通过重启来解决的。重启后会更新。

更新:神秘解决了。看起来NUnit将错误行显示为最后成功执行的语句...将复制/粘贴测试复制到新的控制台应用程序并在VS中运行显示它是包含空引用的if语句块(未显示)之后的行。感谢大家的所有想法。给每个回答的人+1。

8 个答案:

答案 0 :(得分:7)

基于到目前为止的所有信息,我认为“投掷的线路”是错误的(是什么让你认为),或者你的'源'可能与你的构建组件不同步。

这看起来不可能,所以有些“理所当然的假设”是错误的,而且可能假设“您正在查看的源代码与您正在调试的过程相匹配”。

答案 1 :(得分:3)

当表面看起来正确时,你很可能会忽略它。您的DLL / PDB是否与您的源代码匹配350%肯定,从而为您提供正确的线路?

  • 尝试手动删除程序集并运行您正在运行的任何程序。它应该失败吗?
  • 尝试清理解决方案并重新编译。将程序集复制到任何位置并再次运行它。这次有用吗? Null ref在同一个地方?
  • 调试周围的行以获得您期望的值。 parentCategory等应该符合你的想法。
  • 通过抛出异常来修改代码。堆栈跟踪线是否与代码中的行完全匹配?

我有一些非常令人难以置信的经历,因为我的一个假设是错误的。典型的是陈旧的组件。质疑所有假设。

答案 2 :(得分:2)

但是,没有意义的是,OP声明console.writeline输出一个有效的int,并且它调用与他声明错误被抛出的行相同的属性。

堆栈跟踪会有所帮助,或者能够查看实际的单元测试。

答案 3 :(得分:1)

是的,我们能看到类别类的代码吗?特别是Id属性?假设Id属性是int(而不是可以为null的int),则get方法必须访问NULL对象。

答案 4 :(得分:1)

Id可以是一个没有值的可空int类型(int?),但是我觉得属性Id必须做的不仅仅是返回一个int,而且内部的东西是null。

编辑您的编辑显示这不仅仅是特殊的,您能为我们提供堆栈跟踪吗?

答案 5 :(得分:1)

我不是C#的专家,我不确定它是否有所作为,但你是在调试模式还是发布模式下调试?如果您处于发布模式,IDE指向的行和问题所在的行可能不同(我知道在使用Visual Studio时C ++就是这种情况)

答案 6 :(得分:1)

我不得不同意Brian ...也许你使用的是过时的.pdbs,你在调试模式下看到的代码不符合实际调试的代码。

尝试清理项目,并在调试模式下重建它。

答案 7 :(得分:0)

看起来NUnit将错误行显示为上次成功执行的语句...将复制/粘贴测试复制到新的控制台应用程序并在VS中运行显示它是包含null的if语句块(未显示)之后的行REF。感谢大家的所有想法。给每个回答的人+1。