代码之家  ›  专栏  ›  技术社区  ›  Zachary Yates

为什么{在静态方法中抛出NullReferenceException?

  •  6
  • Zachary Yates  · 技术社区  · 14 年前

    public static class Logger
    {
        public static void LogMethodEnter()
        {
            var frame = new StackFrame(1);
            var method = frame.GetMethod();
            Trace.TraceInformation("{0}.{1}.{2}()", method.DeclaringType.Namespace, method.DeclaringType.Name, method.Name);
            Trace.Indent();
        }
    
        public static void LogMethodExit()
        {
            Trace.Unindent();
        }
    }
    

    …意思是有大括号的那条线。我在其他项目中遇到过同样的问题(但不涉及winforms设计器),我认为这是一个与线程相关的问题,但我没有代码来复制它。

    澄清: 空引用异常只发生在winforms设计器中。当应用程序运行时,它不会抛出该错误。

    5 回复  |  直到 14 年前
        1
  •  4
  •   Zachary Yates    14 年前

    我猜行号是off(实际原因没有那么重要),异常实际上是由以下表达式引发的:

    method.DeclaringType.Namespace
    

    您可能会看到NullReference异常的原因是 new StackFrame(1) 前几行的表达式有时会返回空帧。空帧表示调用 .GetMethod() 将返回null,就这样。

    有时会出现空帧的原因是,即时编译器可以选择内联短的、重复调用的方法,比如代码中的方法。这将使您的调用堆栈中断,因此,充其量只能得到一个比预期更高级别的方法,或者最坏的情况是(在主方法中)没有更高级别的方法,而只能得到null。

        2
  •  4
  •   erikkallen    14 年前

    我的猜测是,在类的某个地方有一个静态成员的初始化,并且初始化器抛出一个 NullReferenceException . 此外,我猜您没有静态构造函数,所以您的对象被标记为beforefieldinit,因此 NullReferenceException异常 在使用它的方法被jit时抛出。

    比如:

    public static class Logger
    {
        private static object x = InitObjectX();
        private static object InitObjectX() {
            x.GetHashCode(); // Will throw since x is null.
        }
    
        public static void LogMethodEnter() 
        { 
            var frame = new StackFrame(1); 
            var method = frame.GetMethod(); 
            Trace.TraceInformation("{0}.{1}.{2}()", method.DeclaringType.Namespace, method.DeclaringType.Name, method.Name); 
            Trace.Indent(); 
        } 
    
        public static void LogMethodExit() 
        { 
            Trace.Unindent(); 
        } 
    } 
    
        3
  •  3
  •   Dirk Vollmar    14 年前

    可能是 .pdb文件 已经过时了 .

    高级->调试信息 或者 仅pdb .

        4
  •  1
  •   Zachary Yates    14 年前

    static constructor .

    如果我没记错的话,静态构造函数会在执行时锁定整个对象。

        5
  •  0
  •   cofiem    14 年前

    指向花括号/看似不正确的代码行有时可能会发生。我认为很简单,异常发生在前一行代码上,VisualStudio出于某种原因突出显示了下一行。

    可以猜测,由于许多内部和外部因素,程序可能不会在发生异常的行上完全中断。

    对不起,我解释不太清楚。