Why does the '{' throw a NullReferenceException in a static method?

This one is sort of esoteric. I ran into a NullReferenceException while trying to open a form (in the winforms designer) in a winforms project in visual studio 2008. The stack trace points to the fourth line of the following code:

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();
    }
}

...meaning the line with the opening curly brace. I've run into the same issue (but not involving the winforms designer) on other projects, and I think it was a threading related issue, but I don't have the code to replicate it.

Why does this happen and why does the exception stack trace point to the line with the curly brace?

Clarification: The null reference exception only happens in the winforms designer. When the application is run, it doesn't throw that error.

6
задан Zachary Yates 26 August 2010 в 14:14
поделиться

3 ответа

Я предполагаю, что номера строк отключены (фактическая причина этого не так важна), и исключение на самом деле вызывается этим выражением:

method.DeclaringType.Namespace

И причина, по которой вы можете увидеть исключение NullReference, заключается в том, что выражение new StackFrame(1) парой предыдущих строк может иногда возвращать пустой фрейм. Пустой фрейм означает, что вызов .GetMethod() вернет значение null, и все.

Причина, по которой вы иногда получаете пустой фрейм, заключается в том, что JIT-компилятор может выбрать встраивание коротких, многократно вызываемых методов, таких как тот, что находится в вашем коде. Это сбросит ваш стек вызовов, поэтому в лучшем случае вы получите метод более высокого уровня, чем предполагалось, или в худшем случае (в вашем методе Main) нет более высокого метода, и вы получите нуль.

4
ответ дан 8 December 2019 в 20:11
поделиться

Возможно, .pdb-файл, содержащий информацию о строке ,устарел.

Чтобы исправить это, пересоберите свой проект и убедитесь, что создание файлов .pdb включено в настройках проекта. Для проектов C# это можно настроить на вкладке Сборка, установив для параметра Дополнительно -> Информация об отладке значение полный или только pdb.

3
ответ дан 8 December 2019 в 20:11
поделиться

Иногда может произойти указание на фигурную скобку/кажущуюся некорректной строку кода. Я думаю, что просто исключение возникло в предыдущей строке кода, а Visual Studio почему-то выделяет следующую строку.

Наверное, программа может не сломаться именно на той строке, где возникло исключение, из-за множества внутренних и внешних факторов.

Извините, я не могу объяснить это очень хорошо.

0
ответ дан 8 December 2019 в 20:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: