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 ???
Annonceindlæg fra HP
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();
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
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.
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.
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.
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.
19. februar 2004 - 12:50
#7
Og et svar.
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.
19. februar 2004 - 12:52
#9
ahh selvføldig. Men burde test = new testclass[3] ikke kalde constructeren i testclass ?
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();
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#. :)
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.
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.