2012-04-13 2 views
2

У меня есть ряд отчетов об ошибках из моего приложения, которое, похоже, не имеет никакого смысла. У меня есть статический класс, который имеет множество публичных статических методов, которые вызываются из других частей моего кода. Большинство этих методов создают элемент в документе 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# - ссылка на объект, не установленную на экземпляр объекта) при вызове статического метода?

EDIT: Для тех, кто просил, вот код OtherClass.NewElement:

public class OtherClass { 

    private readonly XmlDocument doc = new XmlDocument(); 

    public XmlElement NewElement(string name) { 
     lock (doc) 
     return doc.CreateElement(name); 
    } 
} 
+3

Возможные виновники: 'OtherStaticClass' (возможно, статический конструктор) или' é' (возвращаемое значение 'OtherStaticClass.NewElement'). Вы пробовали отладку? –

+1

Пожалуйста, покажите нам «некоторые другие вещи». Мне (к сожалению, с большой частотой) пришлось бороться с тем, что номера строк в трассировке стека в производственных средах часто совершенно ошибочны. Очевидно (очевидно), что 'BuildCmd (« pirep »)' не может, возможно, выбросить NRE. Так это не так. Однако имена методов в трассировке стека никогда не ошибаются. Поэтому, если он действительно обвиняет 'SendFlightReport', тогда NRE * defintely * происходит там. Пожалуйста, опубликуйте весь метод. –

+0

Я думаю, было бы полезно показать реализацию «OtherStaticClass.NewElement ...» – grant

ответ

-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

+1

Downvoter, не могли бы вы прокомментировать? – phoog

+1

Я не спускал вниз, но кажется, что вы предполагаете, что код в вопросе попал непосредственно из фактического кода OP ... это довольно широкое предположение, основанное на том, что мы видели в вопросах здесь, на SO. –

+0

Это тот случай? Я никогда не видел этого раньше с другими трассировками стека. –

Смежные вопросы