【发布时间】:2010-10-24 16:23:27
【问题描述】:
我一定是疯了,因为我的单元测试失败了,因为下面的代码抛出了一个空引用异常:
int pid = 0;
if (parentCategory != null)
{
Console.WriteLine(parentCategory.Id);
pid = parentCategory.Id;
}
抛出它的那一行是:
pid = parentCategory.Id;
console.writeline 只是为了在 NUnit GUI 中调试,但输出的是一个有效的 int。
编辑:它是单线程的,因此不能从其他线程分配给 null,并且 Console.WriteLine 成功打印出该值的事实表明它不应该抛出.
编辑: Category 类的相关 sn-ps:
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 给所有回答的人。
【问题讨论】:
-
parentCategory 和 Id 是什么类型?任何隐式运算符?
-
这有关系吗?检查是否为空,它是单线程的,属性被正确访问,因为 Console.WriteLine 成功。 Id 的类型是 int。
-
这段代码应该执行得很好,除非你在 Id 属性中做一些连接。不知何故,我觉得你没有告诉我们整个故事。
-
根据我的经验,这种“不可能”的事情通常是由一些细微的语法错误引起的,比如忘记了大括号、方括号或分号。
-
@Svante 但是编译器应该捕获(大部分)那些东西不是吗?