none
NullReferenceException, die nur produktiv auftritt RRS feed

  • Frage

  • Hallo alle,

    ich bekomme beim Ausfuehren einer exe- Datei in einem Konstruktor eine NullReferenceException, da offensichtlich eine interne Liste nicht vollstaendig gefuellt wird. Fuehre ich das Programm im VisualStudio (2015) aus, laeuft es durch.

    Im Detail:

    Aus XML (config.xml):

    <ab123>
    	<article ekwert="19.02" ausschuss="1.03" name="betaetigung">111000009</article>
    	<article ekwert="5.40" ausschuss="1.03" name="rastgestaenge">111000309</article>
    	<article ekwert="12.43" ausschuss="1.03" name="SG15">124001009</article>
    	<article ekwert="12.43" ausschuss="1.03" name="SG26">124002009</article>
    	<article ekwert="12.43" ausschuss="1.03" name="SG37">124003009</article>
    	<article ekwert="12.43" ausschuss="1.03" name="SG4R">124004009</article>
    </ab123>

    lese ich wie folgt:

    foreach (XmlElement item in config.GetElementsByTagName("article"))
    {
            AB123 ab123 = new AB123();
    	ab123.Artikel = item.InnerXml;
    	ab123.Ausschuss = Convert.ToSingle(item.GetAttribute("ausschuss"), CultureInfo.InvariantCulture);
    	ab123.EkWert = Single.Parse(item.GetAttribute("ekwert"), CultureInfo.InvariantCulture);
    	ab123.Name = item.GetAttribute("name");
            SessionContext.Ab123Teile.Add(ab123);
    }

    Zur Speicherung bediene ich mich einer SessionContext- Klasse: (Ausschnitt)

    class SessionContext
    {
    	//Liste für AB123 Artikel
    	public static List<AB123> Ab123Teile = new List<AB123>();
    }


    Die Klasse AB123 hat folgende Felder:

    public class AB123
    {
    	public string Artikel { get; set; }
    	public float EkWert { get; set; }
    	public float Ausschuss { get; set; }
    	public string Name { get; set; }
    }

    In meiner Klasse "Quality" lese ich die gespeicherten Artikelnummern aus, mittels (als Klassenmember):

    private string _sg15 = SessionContext.Ab123Teile.FirstOrDefault(x => x.Name == "SG15").Artikel;
    private string _sg26 = SessionContext.Ab123Teile.FirstOrDefault(x => x.Name == "SG26").Artikel;
    private string _sg37 = SessionContext.Ab123Teile.FirstOrDefault(x => x.Name == "SG37").Artikel;
    private string _sg4r = SessionContext.Ab123Teile.FirstOrDefault(x => x.Name == "SG4R").Artikel;
    private string _bet = SessionContext.Ab123Teile.FirstOrDefault(x => x.Name == "betaetigung").Artikel;
    private string _rast = SessionContext.Ab123Teile.FirstOrDefault(x => x.Name == "rastgestaenge").Artikel;

    Und hier tritt die NullReferenceException auf. In der Produktivumgebung ist x.Name leer (""). Im VisualStudio enthaelt x.Name (z.B.) "SG15", so wie erwartet.

    Jemand eine Idee?

      Heiko

    Dienstag, 5. September 2017 11:43

Antworten

Alle Antworten

  • Hallo Heiko,

    zeig mal den Code bzw. den exakten Pfad, der im Programm für das Auslesen der XML Datei verwendet wird. Ich gehe davon aus, dass die Datei nicht dort gefunden wird, wo Du sie suchst und daher die Elementliste leer bleibt.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Dienstag, 5. September 2017 11:56
    Moderator
  • Hallo Stefan,

    ich war etwas unpraezise: Die anderen Felder "Artikel","Ausschuss" und "Ekwert" werden gefuellt. (Aus Debug- Instanz)

    (Vom Watch- Fenster)

    SessionContext.Ab123Teile    Count = 6    System.Collections.Generic.List<XYZ.Controlling.WeeklyLogchart.AB123>
        [0]    {XYZ.Controlling.WeeklyLogchart.AB123}    XYZ.Controlling.WeeklyLogchart.AB123
            Artikel    "111000009"    string
            Ausschuss    1.03    float
            EkWert    19.02    float
            Name    ""    string
        [1]    {XYZ.Controlling.WeeklyLogchart.AB123}    XYZ.Controlling.WeeklyLogchart.AB123
            Artikel    "111000219"    string
            Ausschuss    1.03    float
            EkWert    5.4    float
            Name    ""    string
        [2]    {XYZ.Controlling.WeeklyLogchart.AB123}    XYZ.Controlling.WeeklyLogchart.AB123
            Artikel    "092001509"    string
            Ausschuss    1.03    float
            EkWert    12.43    float
            Name    ""    string
        [3]    {XYZ.Controlling.WeeklyLogchart.AB123}    XYZ.Controlling.WeeklyLogchart.AB123
            Artikel    "092002509"    string
            Ausschuss    1.03    float
            EkWert    12.43    float
            Name    ""    string
        [4]    {XYZ.Controlling.WeeklyLogchart.AB123}    XYZ.Controlling.WeeklyLogchart.AB123
            Artikel    "092003509"    string
            Ausschuss    1.03    float
            EkWert    12.43    float
            Name    ""    string
        [5]    {XYZ.Controlling.WeeklyLogchart.AB123}    XYZ.Controlling.WeeklyLogchart.AB123
            Artikel    "092004509"    string
            Ausschuss    1.03    float
            EkWert    12.43    float
            Name    ""    string
            
    Ansonsten:

    public static void LiesConfig()
    {
    	XmlDocument config = new XmlDocument();
    	try
    	{
    		config.Load(@".\Config.xml");
    		_maildomain = config.SelectSingleNode("//maildomain").InnerXml;
    		_recipients = config.SelectSingleNode("//recipients").InnerXml;
    		_startLastWeek = DateTime.Parse(config.SelectSingleNode("//startlastweek").InnerXml);
    		_endLastWeek = DateTime.Parse(config.SelectSingleNode("//endlastweek").InnerXml);
    		_startLastMonth = DateTime.Parse(config.SelectSingleNode("//startlastmonth").InnerXml);
    		_endLastMonth = DateTime.Parse(config.SelectSingleNode("//endlastmonth").InnerXml);
    		_workday = DateTime.Parse(config.SelectSingleNode("//workday").InnerXml);
    		foreach (XmlElement item in config.GetElementsByTagName("article"))
    		{
    			AB123 ab123 = new AB123();
    			ab123.Artikel = item.InnerXml;
    			ab123.Ausschuss = Convert.ToSingle(item.GetAttribute("ausschuss"), CultureInfo.InvariantCulture);
    			ab123.EkWert = Single.Parse(item.GetAttribute("ekwert"), CultureInfo.InvariantCulture);
    			ab123.Name = item.GetAttribute("name");
    			SessionContext.Ab123Teile.Add(ab123);
    		}
    	}
    	catch (FileLoadException fle)
    	{
    		System.Diagnostics.EventLog appLog = new System.Diagnostics.EventLog();
    		appLog.Source = "WeeklyLogchart";
    		appLog.WriteEntry("WeeklyLogcharts.Helpers.Config" + "\n" + Convert.ToString(fle));
    	}
    	catch (FileNotFoundException fnfe)
    	{
    		System.Diagnostics.EventLog appLog = new System.Diagnostics.EventLog();
    		appLog.Source = "WeeklyLogchart";
    		appLog.WriteEntry("WeeklyLogcharts.Helpers.Config" + "\n" + Convert.ToString(fnfe));
    	}
    	catch (XmlException xmle)
    	{
    		System.Diagnostics.EventLog appLog = new System.Diagnostics.EventLog();
    		appLog.Source = "WeeklyLogchart";
    		appLog.WriteEntry("WeeklyLogcharts.Helpers.Config" + "\n" + Convert.ToString(xmle));
    	}
    
    }

    Gruesse

      Heiko

    Dienstag, 5. September 2017 12:57
  • Hallo Heiko,

    hast Du dir mal item.innerXML angeschaut und geprüft, ob dort überhaupt in "name" was drin steht?


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Dienstag, 5. September 2017 13:04
    Moderator
  • Ich habe mir das mal an der Konsole ausgeben lassen.

    Console.Write(item.InnerXml + "\n" + item.GetAttribute("ausschuss") + "\n" + item.GetAttribute("ekwert") + "\n" + item.GetAttribute("name") + "\n\n");
    Starte ich das Programm von lokal (ausserhalb VS) wird item.GetAttribute("name") ausgegeben. Starte ich es vom Netz (via UNC- Pfad) wird item.GetAttribute("name") nicht ausgewertet. Alles andere ist i.O.



    • Bearbeitet H.Sturm Dienstag, 5. September 2017 13:32 Ergaenzung
    Dienstag, 5. September 2017 13:31
  • Hallo Heiko,

    poste doch bitte mal exakt das, was da ausgegeben wird.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Dienstag, 5. September 2017 13:48
    Moderator
  • Ach Sh*t

    Fehler gefunden. Ich habe die config.xml nur auf der Entwicklungsseite mit "name" angepasst. Und nicht auch auf Produktivseite.

    Test, und siehe da: Kaum macht man es richtig, schon funktioniert's.

    Danke fuer die Zeit.

    Dienstag, 5. September 2017 14:05
  • Fehler gefunden. Ich habe die config.xml nur auf der Entwicklungsseite mit "name" angepasst. Und nicht auch auf Produktivseite.

    Sag ich doch :)


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Dienstag, 5. September 2017 14:15
    Moderator