[C#] NullReferenceException bij array met labels

Pagina: 1
Acties:

  • DiNo!
  • Registratie: Juni 2000
  • Laatst online: 17:49
Ik probeer in VS2005 een array met labels te maken, maar ik krijg het niet werkend.

Hier een stukje uit een nieuw Windows Application:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public partial class Form1 : Form
    {

        private int[] i = new int[10];
        private Label[] label = new Label[10];


        public Form1()
        {
            InitializeComponent();

            i[0] = 1;
            label[0].Text = "Hello World";
        }
    }
Dit compileert zonder fouten, maar geeft een fout tijdens het uitvoeren: "Object reference not set to an instance of an object." op regel 13.

Heel vervelend want de integer array i werkt wel.

Van msdn word ik ook niet veel wijzer.

Waarom krijg ik deze fout?

https://github.com/atoomnetmarc/


  • Sybr_E-N
  • Registratie: December 2001
  • Laatst online: 21:37
Heb je inmiddels wel eens gewerkt met de debugger die in je IDE zit? (Zo niet, raadt ik je aan omdat eens te leren. Debuggen is een belangrijk proces in het opsporen oplossen van allerlei problemen die je tegen komt.)

Dan kom je al snel tot de conclusie dat de labels in je array nog niet zijn aangemaakt. Maw je moet nog eerst label[0] = new Label(); aanroepen. Waarom je dat voor deze GUI controls moet doen weet ik ook niet, maar ik zou het zelf ook graag willen weten.

  • DiNo!
  • Registratie: Juni 2000
  • Laatst online: 17:49
Deze melding komt juist uit de IDE en die gaf ook netjes aan waar het niet werkte met een suggestie om 'new' te gebruiken. Echter kon ik die 'new' niet plaatsen, want dat had ik (naar mijn idee) al bij de declaratie gedaan.

Jouw oplossing werkt inderdaad goed. Maar waarom moet ik dan 2x 'new' gebruiken? En, waarom moet dat niet bij een integer?

https://github.com/atoomnetmarc/


  • Brainstorm
  • Registratie: November 2000
  • Laatst online: 05-05 06:13
De eerste new gebruik je om de array aan te maken. Denk een beetje aan C en stel het als volgt voor: 'label' is een pointer naar een array van Label objecten en wijst naar het eerste object van de array. Initieel wijst deze nergens naar toe en is deze null. Dan zeg je: ik wil 10 labels, dus: label = new Label[10]. Je reserveert dan 10 geheugenplaatsen (ieder van bijvoorbeeld 4 bytes) welke allemaal op hun beurt naar een Label object gaan wijzen. Die betreffende Labels zijn echter nog niet fysiek aangemaakt en dus wijzen alle 10 de geheugenplaatsen naar niets, naar null. Je pakt dan de eerste geheugenplaats (label[0]) en zegt dat deze naar een nieuwe label moet wijzen: label[0] = new Label();

De eerste new is dus om de array van pointers aan te maken en de tweede new is om de objecten fysiek aan te maken. Bij een int hoeft dit niet, omdat dit een valuetype is (net zoals long, float, DateTime, iedere andere struct, etc). Ik raad je aan om zelf uit te zoeken wat het verschil is met een gewoon object, dat is belangrijk en die kennis zul je in de toekomst mischien best nodig hebben :).

Programmer's Drinking Song: 99 little bugs in the code, 99 bugs in the code, Fix one bug, compile it again, 100 little bugs in the code. (go to start if bugs>0)


  • DiNo!
  • Registratie: Juni 2000
  • Laatst online: 17:49
Juist! Nu snap ik het: een reservering van een setje geheugenplaatsen van het type 'object' zonder een instantie.

Ja... dan moet je die inderdaad eerst vullen met instanties.

Bedankt voor de heldere uitleg :*)

https://github.com/atoomnetmarc/