我必须忘记,因为我的单元测试失败,因为以下代码抛出了空引用异常:
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。
答案 0 :(得分:7)
基于到目前为止的所有信息,我认为“投掷的线路”是错误的(是什么让你认为),或者你的'源'可能与你的构建组件不同步。
这看起来不可能,所以有些“理所当然的假设”是错误的,而且可能假设“您正在查看的源代码与您正在调试的过程相匹配”。
答案 1 :(得分:3)
当表面看起来正确时,你很可能会忽略它。您的DLL / PDB是否与您的源代码匹配350%肯定,从而为您提供正确的线路?
我有一些非常令人难以置信的经历,因为我的一个假设是错误的。典型的是陈旧的组件。质疑所有假设。
答案 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。