【发布时间】:2012-04-13 02:32:12
【问题描述】:
我从我的应用程序中收到了许多似乎没有任何意义的错误报告。我有一个静态类,它有许多从我的代码的其他部分调用的公共静态方法。这些方法中的大多数都在 XML 文档上创建一个元素。
大多数方法的第一行是调用同一类中的私有静态方法,该方法在 XML 文档上创建元素并返回它,如下所示:
private static XmlElement BuildCmd(string name)
{
XmlElement e = OtherClass.NewElement("CMD");
e.SetAttribute("type", name);
return e;
}
public static uint SendFlightReport(FlightData info, AircraftInfo aInfo)
{
XmlElement cmd = BuildCmd("pirep");
....
some other stuff
....
}
异常生成的堆栈转储都将调用 BuildCmd 的行报告为违规行,这没有任何意义 - 你怎么会有空指针(或者,在 C# 中 - 对象引用未设置为对象的实例)调用静态方法时?
编辑:对于那些询问的人,这里是 OtherClass.NewElement 的代码:
public class OtherClass {
private readonly XmlDocument doc = new XmlDocument();
public XmlElement NewElement(string name) {
lock (doc)
return doc.CreateElement(name);
}
}
【问题讨论】:
-
可能的罪魁祸首:
OtherStaticClass(可能是静态构造函数)或e(OtherStaticClass.NewElement的返回值)。你试过调试吗? -
请给我们看“一些其他的东西”。我(很遗憾,经常)不得不努力解决生产环境中堆栈跟踪中的行号通常完全错误的事实。很明显,
BuildCmd("pirep")无法想象抛出 NRE。所以不是。但是,堆栈跟踪中的方法名称永远不会出错。因此,如果它确实是在责怪SendFlightReport,那么 NRE肯定 正在那里发生。请发布整个方法。 -
我认为展示“OtherStaticClass.NewElement...”的实现会很有价值
-
我同意@M.Babcock 的观点。其他一切看起来都很好,您可以发布
OtherStaticClass.NewElement的代码吗? -
由于
BuildCmd不会静态调用OtherClass.NewElement,你确定OtherClass已经被实例化了吗?
标签: c#