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

Pagina: 1
Acties:

  • Av3ng3rtje
  • Registratie: December 2002
  • Laatst online: 13-04 08:48
Ik ben bezig met een programma wat een xml bestand inleest fragment stukje code van de xml:

XML:
1
2
3
4
5
6
7
8
  <s1 value="Class Skills^0^0" /> 
  <s2 value="Holy^1^1" /> 
  <s3 value="Protection^1^1" /> 
  <s4 value="Retribution^1^1" /> 
  <s5 value="Professions^0^0" /> 
  <s6 value="Blacksmithing^253^300" /> 
  <s7 value="Mining^283^300" /> 
  <s8 value="Secondary Skills^0^0" /> 


Nu lees ik met C# de waardes in een string[] array

C#:
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
string[] skills = new string[41];

// ... verder op
// xmlreader staat aan

case "s1":
    if(xmlrdr.MoveToAttribute("value"))
    {
        if(xmlrdr.Value != "")
        {
            skills[1] = xmlrdr.Value;
        } 
        else 
        {
            skills[1] = "";
        }

    }
    break;

// ... weer iets verder op

int s = 1;

foreach(string skillString in skills) 
{
    string[] arr= skillString.Split('^');

    MySqlCommand insertSkills = new MySqlCommand("INSERT INTO `skills` ( `skillsID` , `skillName` , `skillCurrentVal` , `skillMaxVal` , `order` , `profileID` ) VALUES ('', '" + arr[0] + "', '" + arr[1] + "', '" + arr[2] + "', '" + s + "' , '" + id + "');",dbcon);

    insertSkills.ExecuteNonQuery();

    s++;
}


Nu kom er achter dat:

code:
1
string[] tempArray = skillString.Split('^');


Een "Object reference not set to an instance of an object" genereert, wanneer ik deze regel weghaal en bv de waarde skillString in een textbox append is er niks aan de hand , maar zodra ik object functies ga gebruiken is het error! :(

Ik heb geprobeerd om een vergelijkbare code in een nieuw (test) project op dezelfde manier te verwerken zoals ik hier doe , en daar werkt het vlekkeloos

[ Voor 27% gewijzigd door Av3ng3rtje op 15-06-2005 17:14 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 06-05 15:36
Wat jij moet doen, is je code eens debuggen, en stap voor stap door je code lopen.
Als je een dergelijke exceptie krijgt, wil dat zeggen dat je ergens naar een stuk code verwijst dat niet gealloceerd is.
In jouw specifieke geval zal dat zijn dat skillString null is; maar dat had je met een beetje zelf debuggen ook wel zelf kunnen vinden.

https://fgheysels.github.io/


  • Av3ng3rtje
  • Registratie: December 2002
  • Laatst online: 13-04 08:48
whoami schreef op woensdag 15 juni 2005 @ 17:08:
Wat jij moet doen, is je code eens debuggen, en stap voor stap door je code lopen.
Als je een dergelijke exceptie krijgt, wil dat zeggen dat je ergens naar een stuk code verwijst dat niet gealloceerd is.
In jouw specifieke geval zal dat zijn dat skillString null is; maar dat had je met een beetje zelf debuggen ook wel zelf kunnen vinden.
Als ik textBox.AppendText(skillString + "\r\n"); doe in de foreach spugt hij netjes alle regeltjes van het xml uit dus het object skillString kan niet null zijn omdat het wel degelijk tekst bevat , alleen bij het aanroepen van de object functies krijg ik een object reference error.

  • whoami
  • Registratie: December 2000
  • Laatst online: 06-05 15:36
Ben je er trouwens zeker van dat dat stuk code compileert ?
Als ik in de MSDN kijk, dan zie ik geen Split method die één character als argument neemt. Split neemt een array van characters als argument.

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Laatst online: 06-05 15:36
Av3ng3rtje schreef op woensdag 15 juni 2005 @ 17:12:
[...]


Als ik textBox.AppendText(skillString + "\r\n"); doe in de foreach spugt hij netjes alle regeltjes van het xml uit dus het object skillString kan niet null zijn omdat het wel degelijk tekst bevat , alleen bij het aanroepen van de object functies krijg ik een object reference error.
Dat biedt geen garantie dat skillString niet null kan zijn.
Doe maar eens dit:
code:
1
2
string s = null;
textBox1.AppendText(s);

Dit gaat geen exceptie gooien.

Check dus eerst of skillString null is vooraleer je die split method aanroept, want dat is de fout. Daar ben ik 100% zeker van.

https://fgheysels.github.io/


  • Av3ng3rtje
  • Registratie: December 2002
  • Laatst online: 13-04 08:48
Ik heb het probleem gevonden

Oplossing:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
foreach(string skillString in skills) 
{
    if(skillString != null) 
    {
        string[] arr = skillString.ToString().Split('^');

        MySqlCommand insertSkills = new MySqlCommand("INSERT INTO `skills` ( `skillsID` , `skillName` , `skillCurrentVal` , `skillMaxVal` , `order` , `profileID` ) VALUES ('', '" + arr[0] + "', '" + arr[1] + "', '" + arr[2] + "', '" + s + "' , '" + id + "');",dbcon);

        insertSkills.ExecuteNonQuery();
    }

    s++;
}


Ik had al eerder if(skillString != "") staan en vervolgens de Split etc... maar null is dus beter in alle gevallen. Stupid me :z

[ Voor 31% gewijzigd door Av3ng3rtje op 15-06-2005 17:21 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 06-05 15:36
Wat heb ik je gezegd....

null is niet beter in alle gevallen, want een lege string zal nu ook in die loop terecht komen, en wat gaat arr[0] daar van vinden, als er niets in die array zit ?

Trouwens, wat doet die s++ daar ?

https://fgheysels.github.io/


  • Av3ng3rtje
  • Registratie: December 2002
  • Laatst online: 13-04 08:48
whoami schreef op woensdag 15 juni 2005 @ 17:22:
Wat heb ik je gezegd....

null is niet beter in alle gevallen, want een lege string zal nu ook in die loop terecht komen, en wat gaat arr[0] daar van vinden, als er niets in die array zit ?

Trouwens, wat doet die s++ daar ?
Ah oke , uh s is een integer en wordt in de query opgenomen om de order aan te geven

  • whoami
  • Registratie: December 2000
  • Laatst online: 06-05 15:36
En dat compiled ?
code:
1
'" + s + "'

https://fgheysels.github.io/


  • Av3ng3rtje
  • Registratie: December 2002
  • Laatst online: 13-04 08:48
whoami schreef op woensdag 15 juni 2005 @ 17:25:
En dat compiled ?
code:
1
'" + s + "'
Ja , geen problemen.. het veld is ook een BIGINT

Verwijderd

whoami schreef op woensdag 15 juni 2005 @ 17:25:
En dat compiled ?
code:
1
'" + s + "'
Met Option Strict Off is dat ook geen probleem, maarja zo wil je eigenlijk niet programmeren.

  • Av3ng3rtje
  • Registratie: December 2002
  • Laatst online: 13-04 08:48
Verwijderd schreef op woensdag 15 juni 2005 @ 17:35:
[...]


Met Option Strict Off is dat ook geen probleem, maarja zo wil je eigenlijk niet programmeren.
Ik weet dat het netter moet, dit is alleen maar om te kijken of het wel werkt.

[ Voor 6% gewijzigd door Av3ng3rtje op 15-06-2005 17:39 ]


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 00:39
Niet om je af te zeiken, maar deze vind ik ook mooi:
C#:
1
2
3
4
5
6
7
8
        if(xmlrdr.Value != "") 
        { 
            skills[1] = xmlrdr.Value; 
        }  
        else  
        { 
            skills[1] = ""; 
        } 

Roomba E5 te koop


  • whoami
  • Registratie: December 2000
  • Laatst online: 06-05 15:36
Verwijderd schreef op woensdag 15 juni 2005 @ 17:35:
[...]


Met Option Strict Off is dat ook geen probleem, maarja zo wil je eigenlijk niet programmeren.
Option Strict Off bestaat niet in C#.
Bij nader inzien is dat gewoon mogelijk doordat de + operator overloaded is, en zo weet wat hij moet doen als hij een int bij een string moet adden.
Geen probleem dus.

Trouwens, als je wilt checken of een string leeg is, dan check je beter of de lengte van de streng 0 is of niet.

[ Voor 13% gewijzigd door whoami op 15-06-2005 18:36 ]

https://fgheysels.github.io/


  • Alex
  • Registratie: Juli 2001
  • Laatst online: 28-02 19:26
whoami schreef op woensdag 15 juni 2005 @ 18:35:
[...]


Option Strict Off bestaat niet in C#.
Bij nader inzien is dat gewoon mogelijk doordat de + operator overloaded is, en zo weet wat hij moet doen als hij een int bij een string moet adden.
Geen probleem dus.

Trouwens, als je wilt checken of een string leeg is, dan check je beter of de lengte van de streng 0 is of niet.
Wat dacht je van de sting.empty is C# :) ?

Deze post is bestemd voor hen die een tegenwoordige tijd kunnen onderscheiden van een toekomstige halfvoorwaardelijke bepaalde subinverte plagiale aanvoegend intentioneel verleden tijd.
- Giphart


  • whoami
  • Registratie: December 2000
  • Laatst online: 06-05 15:36
Wat wil je daarmee zeggen ?
Heb je het hier op het checken of een string leeg is ?

https://fgheysels.github.io/


  • marrik
  • Registratie: Augustus 2003
  • Laatst online: 20-07-2025

marrik

Live long and prosper

Mijn standaard methode om een string te controleren:

code:
1
 if (xmlrdr.Value != null && xmlrdr.Value.Trim() != string.empty)

Op deze manier controleer je eerst of het object (xmlrdr.Value) is gevuld en zo ja, of de getrimde waarde leeg is.

Marrik


  • whoami
  • Registratie: December 2000
  • Laatst online: 06-05 15:36
Gooi dat eens in FxCop; die zal zeggen dat het beter is om te checken op de Length property van je string, ipv te checken op string.empty.
Gewoon omdat dit iets performanter is; mieregeneuk, I know.

Daarbij is het gewoon beter om je strings altijd te initializeren met string.Empty; dan hoef je in de meeste gevallen niet meer te checken op null.

https://fgheysels.github.io/

Pagina: 1