2017-03-29 2 views
-1

Ich habe eine Klassenbibliothek und debugge sie mit einer Konsolenanwendung. Das funktioniert perfekt.C# Class gibt Nullobjekt zurück

Die Klasse ist für die Verwendung mit einem vorhandenen Windows-Dienst auf einem Server vorgesehen. Ich habe nicht viel Zugriff auf den Server.

Ich aktualisiere den Dienst, um die Klassenbibliothek zu verwenden. Es ist in der Klassenbibliothek in der Lösung enthalten, es ist referenziert und es ist auf der Seite enthalten.

Wenn es jedoch auf dem Server erstellt wird, gibt es ein Null-Objekt zurück.

Der entsprechende Service-Stück:

using MyNamespace; 
... 
private void TimerTick(){ 
    //this is called every minute 
    EventLog.WriteEntry("myLog", "Start test", EventLogEntryType.Information); 
    try 
    { 
     EventLog.WriteEntry("myLog", "I see this", EventLogEntryType.Information); 
     MyClass test1 = new MyClass(); //Error occurs here 
     EventLog.WriteEntry("myLog", "I never see this", EventLogEntryType.Information); 
     test1.MyFunction(); 
    } 
    catch (Exception e) 
    { 
     EventLog.WriteEntry("myLog", e.Message, EventLogEntryType.Information); 
    } 
    EventLog.WriteEntry("myLog", "Conclude test", EventLogEntryType.Information); 
} 

Und die betreffende Klasse:

namespace MyNamespace 
{ 
    public class MyClass 
    { 

     public SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["myConnection"].ConnectionString); 
     public void MyFunction(){ 
      EventLog.WriteEntry("MyLog", "Get links", EventLogEntryType.Information); 
     } 
    } 
} 

im Ereignisprotokoll ich den Standard erhalten:

Object reference not set to an instance of an object.

Es gibt keine Fehler in der Build und Bereitstellung auf dem Server. Der Dienst wird wie erwartet ausgeführt. Bei der Instanziierung der Klasse handelt es sich nur um eine Nullverweisausnahme.

ich ziemlich neu bin zu C# /. Net

Gibt es eine bessere Art und Weise zur Fehlerbehebung diesen zu gehen, wenn die einzige Störmeldeversand I ist durch die EventLog bekommen?

Was sind die möglichen Ursachen für die Klasseninstanziierung, die eine Nullreferenzausnahme verursacht?

Dinge, die ich versucht

Zuerst verwendet Exception.ToString() die Stack-Trace zu erhalten, anstatt Exception.Message wie ich anfangs tat. Dies gab mir sehr viel mehr Informationen zum Debuggen mit.

Zweitens kann der Klassenkonstruktor selbst für einen Fehler als Klasseninstanziierung nicht selbst eine Nullreferenz werfen.

+2

Beenden Sie die Verwendung von 'e.Message' verwenden Sie stattdessen' e.ToString() '. Sie haben viel mehr nützliche Informationen darüber, wo der Fehler protokolliert wird. Was Ihre Frage "Wie gehe ich bei der Fehlersuche vor, wenn die einzige Fehlermeldung, die ich erhalte, über das EventLog ist? Was sind die möglichen Ursachen dafür, dass die Klasse null ist? *" Sehen Sie die Antworten im verknüpften Duplikat genau diese Dinge. –

+0

Versuchen Sie das Debuggen und sehen Sie, ob Sie die Ausnahme getroffen haben. Es wäre auch hilfreich, einen Stack-Trace zu sehen. –

+0

Hängt Ihre Methode 'MyFunction()' von anderen Eigenschaften ab, die in einer neu instanziierten 'MyClass'-Instanz möglicherweise null sind? Dies setzt voraus, dass es keine Probleme mit der 'EventLog'-Instanz selbst gibt (vorausgesetzt, es handelt sich um die eingebaute' 'EventLog''-Instanz).Diagnostics') –

Antwort

0

Die Exception.Message gibt begrenzte Informationen zurück. Bessere Debug-Informationen können durch die Verwendung Exception.ToString() protokolliert werden, wenn eine Fehlerprotokollierung:

try 
{ 
    //your code 
} 
catch (Exception e) 
{ 
    EventLog.WriteEntry("myLog", e.ToString(), EventLogEntryType.Information);  
} 

Es ist auch nicht möglich, dass eine Klasse Instanziierung eine NULL-Verweis Ausnahme zu werfen - wenn Sie eine während einer Instanziierung zu sehen, etwas in der Klasse muss einen Fehler werfen. Verwenden Sie Exception.ToString() sollte die notwendigen Informationen zur Verfügung stellen, um das spezifische Problem zu identifizieren.