Avatar billede ichiban Nybegynder
19. februar 2004 - 12:13 Der er 11 kommentarer og
1 løsning

objekt error

Hej Alle sammen

Jeg tror jeg har set mig blind på dette problem, og at jeg har brug for en pause.

Jeg får denne fejl:

An unhandled exception of type 'System.NullReferenceException' occurred in error.exe

Additional information: Object reference not set to an instance of an object.

Kode:

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

namespace error
{
    /// <summary>
    /// Summary description for Form1.
    /// </summary>
    public class Form1 : System.Windows.Forms.Form
    {
        private System.Windows.Forms.Button button1;
        private System.Windows.Forms.Label label1;
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.Container components = null;

        private testclass [] test = null;
        public Form1()
        {
            //
            // Required for Windows Form Designer support
            //
            InitializeComponent();

            //
            // TODO: Add any constructor code after InitializeComponent call
            //
        }

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        protected override void Dispose( bool disposing )
        {
            if( disposing )
            {
                if (components != null)
                {
                    components.Dispose();
                }
            }
            base.Dispose( disposing );
        }

        #region Windows Form Designer generated code
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.button1 = new System.Windows.Forms.Button();
            this.label1 = new System.Windows.Forms.Label();
            this.SuspendLayout();
            //
            // button1
            //
            this.button1.Location = new System.Drawing.Point(112, 136);
            this.button1.Name = "button1";
            this.button1.TabIndex = 0;
            this.button1.Text = "button1";
            this.button1.Click += new System.EventHandler(this.button1_Click);
            //
            // label1
            //
            this.label1.Location = new System.Drawing.Point(112, 56);
            this.label1.Name = "label1";
            this.label1.TabIndex = 1;
            this.label1.Text = "label1";
            //
            // Form1
            //
            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
            this.ClientSize = new System.Drawing.Size(292, 266);
            this.Controls.AddRange(new System.Windows.Forms.Control[] {
                                                                          this.label1,
                                                                          this.button1});
            this.Name = "Form1";
            this.Text = "Form1";
            this.ResumeLayout(false);

        }
        #endregion

        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.Run(new Form1());
        }

        private void button1_Click(object sender, System.EventArgs e)
        {
            test = new testclass [3];
            this.label1.Text= test[0].x.ToString();
        }
    }

    class testclass
    {
        public int x = 3;
    }

}


Hvad gør jeg galt ???
Avatar billede arne_v Ekspert
19. februar 2004 - 12:37 #1
test = new testclass [3];
           
skal nok være:

test = new testclass [3];
for(int i = 0; i < test.Length; i++) test[i] = new testclass();
Avatar billede burningice Nybegynder
19. februar 2004 - 12:45 #2
sikker på det... ?! der burde da netop blive oprettet tre testclass'es, ved at skrive

test = new testclass[3];

og da x-field'et i classen fra start er sat til 3.. så.. ja, men det kan da godt være, selvom jeg ikke lige hvorfor det skulle være sådan
Avatar billede ichiban Nybegynder
19. februar 2004 - 12:47 #3
Det løste problemet, men jeg forstår ikke helt hvorfor ?
test[0] inderholder den ikke, et objekt af typen testclass ?
Hvor objektet er initaliseret.
PGA.

int [] intarray = new int [9];
this.label1.Text = intarray[1].ToString();

Dette giver 0. Men det er måske pga. ToString give 0 hvis intarray[1] = null.
Avatar billede burningice Nybegynder
19. februar 2004 - 12:47 #4
nej, det er mig der sidder og tåger *tager en slurk mere af kaffen*, kunne være det få mig lidt op på dupperne.

selvfølgelig er det da det, da der jo bare bliver "lavet plads" til tre classer af typen testclass i hukommelsen.. man skal selv sørge for at sætte noget ind på de pågældende pladser.
Avatar billede burningice Nybegynder
19. februar 2004 - 12:49 #5
ichiban>> det med dit int-array, kommer af at int er en valuetype og derfor aldrig kan være null, men vil default være 0.

så hvis du opretter en int uden at sætte den til noget, så vil den være 0, hvor en string (reference-type) f.eks. vil være null.
Avatar billede arne_v Ekspert
19. februar 2004 - 12:50 #6
ichiban>

test = new testclass[3];

allokerer et array med 3 elementer af typen reference til testclass

for(int i = 0; i < test.Length; i++) test[i] = new testclass();

allokerer 3 instanser af testclass og assigner til de 3 referencer

int er en simpel data type og får værdien 0. testclass er et objekt
og referencerne får værdien null.
Avatar billede arne_v Ekspert
19. februar 2004 - 12:50 #7
Og et svar.
Avatar billede sekhmet_ds Nybegynder
19. februar 2004 - 12:51 #8
Du kan evt. hvis det er tale om en struct kalde Initialize metoden på dit array, men ellers er det som du selv siger bare oprettet plads.
Avatar billede ichiban Nybegynder
19. februar 2004 - 12:52 #9
ahh selvføldig. Men burde test = new testclass[3] ikke kalde constructeren i testclass ?
Avatar billede arne_v Ekspert
19. februar 2004 - 12:52 #10
Hvis du kender C++ så er det:

class testclass;
typedef testclass *testclasptr;

testclass **test = new testclassptr[3];
for(int i = 0; i < 3; i++) test[i] = new testclass();
Avatar billede ichiban Nybegynder
19. februar 2004 - 12:54 #11
Ja sådan ville jeg også gøre det i C++. Jeg er måske blevet for vant til at altig er så lige til og let i C#. :)
Avatar billede sekhmet_ds Nybegynder
19. februar 2004 - 14:13 #12
Hvordan skulle den bare kunne kalde constructoren i en klasse? Hvad nu hvis klassen ikke har en constructor der ikke tager nogen argumenter? Det har en struct jo altid og derfor forskellen.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester