【问题标题】:Null pointer errors with Static methods静态方法的空指针错误
【发布时间】: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#


【解决方案1】:

我怀疑您正在运行发布版本。由于编译器优化,在这种情况下,行号通常会略有偏差。尝试运行调试版本;你可能会发现异常实际上是在.... some other stuff ....的第一行或第二行抛出的

例如看

https://stackoverflow.com/a/114854/385844

http://social.msdn.microsoft.com/Forums/zh/vsdebug/thread/afb7ae70-3e0c-4ea9-86ab-633fe1f9cf6a(VB.NET,但仍然...)

http://social.msdn.microsoft.com/Forums/en-US/tfsbuild/thread/6af62159-fe6b-4554-8e46-d2b6c06fa253

【讨论】:

  • 我没有投反对票,但您似乎假设问题中的代码直接来自 OP 的实际代码......这是一个非常广泛的假设,基于我们在这里看到的问题在 SO 上。
  • 是这样吗?我以前从未在其他堆栈跟踪中看到过这种情况。
  • @LukeKolin 我一直在工作中看到它(显然像 Kirk Woll),但我现在不在工作。我只是试图用一个简单的程序重现这个,但没有运气。明天我到办公室看看能不能想出点什么来。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-21
相关资源
最近更新 更多