[C#] Object reference not set to an instance of an object.

Pagina: 1
Acties:

  • DaNose
  • Registratie: Juni 1999
  • Niet online
Ben sinds een week of 2 bezig met C# en programmeren in het algemeen en ik loop nu tegen een probleem aan waar ik niet uit kom. Google kan mij ook niet helpen, vandaar dat ik het hier maar probeer.

Ik probeer een XML file in te lezen en de regels tussen <tr en </tr> in een jagged array te krijgen. Wat ik gemaakt heb compiled prima, maar ik krijg tijdens runtime een error "Unhandled Exception: System.NullReferenceException: Object reference not set to an instance of an object."

Ik begrijp hier uit dat ik iets niet goed gedeclareerd/geinitialiseerd/whatever heb, maar ik begrijp niet goed hoe dat dan zou moeten. De sourcecode volgt hieronder, maar de regel(s) waar de error door onstaat is "XMLSections[row][column] = Line;" wanneer ik deze uitcommentarieer loopt het programma prima door al zijn loops.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
using System;
using System.IO;
using System.Text.RegularExpressions;

class RWxml
{
    public static void Main()
    {
        //open file
        FileStream ExcelHTM = new FileStream("Alberttemp2.htm", FileMode.Open);
        StreamReader FStreamIn = new StreamReader(ExcelHTM);
        
        //string XML contains complete contents of alberttemp2.htm
        string XML = FStreamIn.ReadToEnd();
        //Close file
        FStreamIn.Close();
        
        //Every row of XMLModified contains a single line from string XML. XML is split by newline character.
        string[] XMLModified=XML.Split('\n');
        //Jagged array XMLSections. Not very efficient, because XMLModified.Lenght is always a lot longer than XMLSections
        //Don't now how to avoid this (yet) though.
        string[][] XMLSections = new string[XMLModified.Length][];
                
        //create new regex to look for start of tr in XML file
        Regex TableStart = new Regex("<tr ");
        //create new regex to look for end of tr in XML file
        Regex TableEnd = new Regex("</tr>");
        bool StartFillingArray = false;
                
        int row = 0;
        int column = 0;
        
        //check every line in XMLModified.
        foreach(string Line in XMLModified)
        {
            //create new matches for regexes created above.
            Match FoundStart = TableStart.Match(Line);
            Match FoundEnd = TableEnd.Match(Line);
            
            //If <tr  was found in string line, put value of line in XMLSections[row][column]
            //and set StartFillingArray to true so array XMLSections can be filled with all lines between <tr and </tr> 
            if(FoundStart.Success)
            {
                XMLSections[row][column] = Line;
                column++;
                StartFillingArray = true;
            }
            
            //If </tr>  was found in string line, put value of line in XMLSections[row][column]
            //Set StartFillingArray to false to prevent lines other than the lines between <tr  and </tr> to be filled
            //into XMLSections Array
            else if(FoundEnd.Success)
            {
                XMLSections[row][column] = Line;
                row++;
                column = 0;
                StartFillingArray = false;
            }
            
            //If StartFillingArray is set to true, start filling XMLSectionsArray with all lines between <tr  and </tr>
            else if(StartFillingArray == true)
            {
                XMLSections[row][column] = Line;
                column++;
            }
        
        }
    }
}


Is er iemand die weet hoe ik dit op kan lossen? Bij voorbaat dank.

De versie van het .NET Framework die ik gebruik is trouwens 1.1.4322

[ Voor 9% gewijzigd door DaNose op 30-05-2004 01:18 ]


  • Gert
  • Registratie: Juni 1999
  • Laatst online: 05-12-2025
code:
1
string[][] XMLSections = new string[XMLModified.Length][]


Ik zou daar tussen de tweede [] ook een waarde zetten, hoewel ik dan eerder een foutmelding in de trant van index > size zou verwachten, maar misschien is dit zo geimplementeerd in C#. :)

Oja, zat je code tussen [ code ][/ code ] tags, dat leest makkelijker. :)

[ Voor 14% gewijzigd door Gert op 30-05-2004 01:11 ]


  • The - DDD
  • Registratie: Januari 2000
  • Laatst online: 16-05 13:05
Niet zelf met het handje XML gaan parsen, maar gebruik maken van de classes die .NET je hiervoor biedt.

Verwijderd

Eerst stel je XMLSections gelijk aan een String-object

Daarna roep je XMLSections als volgt aan: XMLSections[row][column]
Die row en column collectie... hoort dat dan wel bij het string-object?

De waarschuwing laat weten dat XMLSections niets bevat (= Null)
Misschien is dat fout?

  • DaNose
  • Registratie: Juni 1999
  • Niet online
Gert schreef op 30 mei 2004 @ 01:11:
code:
1
string[][] XMLSections = new string[XMLModified.Length][]


Ik zou daar tussen de tweede [] ook een waarde zetten, hoewel ik dan eerder een foutmelding in de trant van index > size zou verwachten, maar misschien is dit zo geimplementeerd in C#. :)
Tussen de tweede set brackets hoeft geen lengte aanduiding te staan. Jagged Arrays hebben een variabele tweede dimensie.
The - DDD schreef op 30 mei 2004 @ 01:11:
Niet zelf met het handje XML gaan parsen, maar gebruik maken van de classes die .NET je hiervoor biedt.
Heb je helemaal gelijk in, hoewel ik die classes (nog) niet ken is dat waarschijnlijk handiger, maar het probleem wat zich nu voordoet heeft volgens mij niet specifiek met XML te maken. Het principe zou moeten werken, maar de declaratie van XMLModified klopt blijkbaar niet. Hoe los ik dit op?
Verwijderd schreef op 30 mei 2004 @ 01:22:
De waarschuwing laat weten dat XMLSections niets bevat (= Null)
Misschien is dat fout?
Dat lijkt me inderdaad de fout, maar moet ik dan voor elke rij in een array een waarde toekennen? Lijkt me erg lastig, dus het zal vast anders werken.
Oftewel: hoe zorg ik ervoor dat een array niet "null" bevat, maar ook niet gevuld hoeft te worden met onzin om zo'n error te voorkomen?

Verwijderd

Jagged arrays zijn niet je standaard multidimensionale arrays, maar zijn arrays van arrays. Jij declareert een jagged array, maar probeert hem te benaderen als een 2-dimensionale array. Voor het lezen van losse elementen in de geneste arrays werkt dat, maar voor het toewijzen niet.

Je zou je code kunnen wijzigen door een tijdelijke array met strings te maken zodra je een <tr tegenkomt, en die te vullen met Line's totdat je de </tr>, om deze tijdelijke array dan pas aan de XMLSections jagged array toe te wijzen.

HTH :)

Zie ook: http://msdn.microsoft.com...tml/vclrfjaggedarrays.asp

[ Voor 12% gewijzigd door Verwijderd op 30-05-2004 03:30 ]


  • DaNose
  • Registratie: Juni 1999
  • Niet online
Verwijderd schreef op 30 mei 2004 @ 03:27:
Je zou je code kunnen wijzigen door een tijdelijke array met strings te maken zodra je een <tr tegenkomt, en die te vullen met Line's totdat je de </tr>, om deze tijdelijke array dan pas aan de XMLSections jagged array toe te wijzen.

HTH :)

Zie ook: http://msdn.microsoft.com...tml/vclrfjaggedarrays.asp
Dit lost het inderdaad op! Iedereen bedankt voor zijn/haar hulp _/-\o_ Ik zie nu dat er nog wel wat bugjes in dit brouwsel van me zitten, maar dat is de volgende stap. En ik ga eens kijken naar die XML classes van .NET. Misschien dat ik daar nog wat mee kan.

  • The - DDD
  • Registratie: Januari 2000
  • Laatst online: 16-05 13:05
Succes.... :)

Enne onthou altijd dat een echte programmeur zo lui mogelijk is. ;) Dus maak gebruik van standaard bibliotheken.
Pagina: 1