Laden...

NullReferenceException bei ToArray()-Aufruf

Erstellt von Kuehter vor 9 Jahren Letzter Beitrag vor 9 Jahren 2.419 Views
K
Kuehter Themenstarter:in
52 Beiträge seit 2015
vor 9 Jahren
NullReferenceException bei ToArray()-Aufruf

Habe folgendes Problem dafür zeige ich euch mal erst den Code


        void frm_FormClosed(object sender, FormClosedEventArgs e)
        {
            List<string> newDataList = new List<string>();
            try
            {
                Form frm = ((newAdress)sender);
                frm.FormClosed -= frm_FormClosed;
                newDataList = newDatas();
                DataRow workRow = kundendaten.NewRow();
                string[] array = newDataList.ToArray();          // Hier Tritt das Problem auf 
                for (int i = 0; i <= newDataList.Count; i++)
                {
                    workRow[i] = array[i];
                }
                kundendaten.Rows.Add(workRow);
                newDataList.Clear();
            }
            catch (Exception)
            {

                MessageBox.Show("Message" + e);
            }
        }

an der gekennzeichneten Stelle tritt folgender Fehler auf > Fehlermeldung:

Eine Ausnahme (erste Chance) des Typs "System.NullReferenceException" ist in IPChanger.exe aufgetreten.

Zusätzliche Informationen: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.

2.207 Beiträge seit 2011
vor 9 Jahren

Hallo Kuehter,

ja, weil newDataList = null ist. Darauf ein ToArray() aufrufen und dann knallts 😉

dein

newDatas();

gibt also null zurück.

[FAQ] NullReferenceException: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt

[Artikel] Debugger: Wie verwende ich den von Visual Studio?

Wieso machst du dir erst eine Liste, überschreibst sie dann mit was auch immer und rufst dann ein ToArray() drauf auf? Das Erstellen der Liste kannst du dir sparen, lass die Methode newDatas() ein Array zurückgeben und du sparst dir die Aufrufe.

Gruss

Coffeebean

K
Kuehter Themenstarter:in
52 Beiträge seit 2015
vor 9 Jahren

eine gute Idee 😁
war ich auch schon am überlegen aber dachte mit ein wenig Schreibfaulheit kann man das auch schaffen 😉
falsch gedacht.

K
Kuehter Themenstarter:in
52 Beiträge seit 2015
vor 9 Jahren

Habe es gekürzt kann mal den ganzen Quellcode zeigen vllt kommt da bei euch was rum ich habe immer noch nullexeption.

Form1:



 private void button6_Click_1(object sender, EventArgs e)
        {
            newAdress frm = new newAdress();
            frm.FormClosed += frm_FormClosed;
            frm.Show();
        }

        private string[] newDatas()
        {
            newAdress frm = new newAdress();
            return frm.getneueDaten();
        }

        void frm_FormClosed(object sender, FormClosedEventArgs e)
        {
            try
            {
                Form frm = ((newAdress)sender);
                frm.FormClosed -= frm_FormClosed;                
                DataRow workRow = kundendaten.NewRow();
                for (int i = 0; i <= newDatas().Length; i++)
                {
                    workRow[i] = newDatas()[i];
                }
                kundendaten.Rows.Add(workRow);
            }
            catch (Exception)
            {

                throw;
            }
        }


Form 2(newAdress):



       private void button1_Click(object sender, EventArgs e)
        {

            Close();

        }

        private void newAdress_FormClosed(object sender, FormClosedEventArgs e)
        {
            string[] array = new string[8];

            if (textBox1.Text == "")
                MessageBox.Show("Kundenname fehlt.");
            else
                array[0] = textBox1.Text;

            if (textBox2.Text == "")
                MessageBox.Show("Adaptername fehlt.");
            else
                array[1] = textBox2.Text;

            if (textBox3.Text == "")
                MessageBox.Show("IP-Adresse fehlt.");
            else
                array[2] = textBox3.Text;

            if (textBox7.Visible == false)
            {
                textBox7.Text = " ";
                array[3] = textBox7.Text;
            }
            else
                array[3] = textBox7.Text;

            if (textBox4.Text == "")
                MessageBox.Show("Subnetzmaske fehlt.");
            else
                array[4] = textBox4.Text;

            if (textBox8.Visible == false)
            {
                textBox8.Text = " ";
                array[5] = textBox8.Text;
            }
            else
                array[5] = textBox8.Text;

            if (textBox5.Text == "")
            {
                textBox5.Text = " ";
                array[6] = textBox5.Text;
            }
            else
                array[6] = textBox5.Text;

            if (textBox6.Text == "")
            {
                textBox6.Text = " ";
                array[7] = textBox6.Text;
            }
            else
                array[7] = textBox6.Text;

            setneueDaten(array);
        }

2.207 Beiträge seit 2011
vor 9 Jahren

Wahrscheinlich gibt:

frm.getneueDaten();

null zurück.

Bitte benutze den oben verlinkten Debugger!

[Hinweis] Wie poste ich richtig? Punkt 8

1.696 Beiträge seit 2006
vor 9 Jahren

Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.

**:::

3.170 Beiträge seit 2006
vor 9 Jahren

Hallo,

mit diesem Schleifenkopf

for (int i = 0; i <= newDatas().Length; i++)

kracht es übrigens auch noch mit IndexOutOfRangeException, sobald Du das NullReference-Problem gelöst hast...
Warum nicht foreach?

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

K
Kuehter Themenstarter:in
52 Beiträge seit 2015
vor 9 Jahren

Habe das ganze ding jetzt abgespeckt und neu überdacht die der lösungsansatz ist noch mal ganz anders



  void frm_ClosedWithArgs(object sender, newAdress.ClosedWithArgsEventArgs e)
        {
            newAdress frm = ((newAdress)sender);
            frm.ClosedWithArgs -= frm_ClosedWithArgs;
            DataRow workRow = kundendaten.NewRow();

            try
            {
                for (int i = 0; i < e.ReturnValue.Length; i++)
                {
                    workRow[i] = e.ReturnValue[i].ToString();
                }
                kundendaten.Rows.Add(workRow);
            }
            catch (Exception)
            {

                MessageBox.Show("Die Daten wurden nicht eingetragen");
            }

        }


C
224 Beiträge seit 2009
vor 9 Jahren

Du solltest nicht erwarten, dass wenn ein x beliebiger Fehler auftritt, dass dann gilt "Die Daten wurden nicht eingetragen". Prüfe, ob "e.ReturnValue" bzw. "e.ReturnValue[ i ]" einen Wert enthält. Bei "workRow[ i ] = e.ReturnValue[ i ]" musst Du sicherstellen, dass die Längen beider Arrays identisch sind. Ansonsten erhälst Du ggf. die Fehlermeldung "Die Daten wurden nicht eingetragen".

Falls Du es vermeiden kannst bzw. der Aufwand nicht zu groß ist, solltest Du immer statt "catch (Exception)" einen bestimmten Fehlertyp verwenden wie z.B. "catch (ArgumentException)", da Du mit "catch (Exception)" auch alle Systemfehler abfängst wie z.B. OutOfMemoryException.

16.807 Beiträge seit 2008
vor 9 Jahren

OutOfMemoryException, sofern sie aus der aktuell rennenden Anwendung stammt, kann nicht abgefangen werden.
Soviel aber nur als Hinweis.

U
135 Beiträge seit 2009
vor 9 Jahren

Etwas, das Du Dir vielleicht noch frühzeitig angewöhnen solltest: verwende sprechende Controlnamen. Wenn Du mal 20 Textboxen auf einer Form hast: weißt Du dann noch auf die Schnelle, dass "textBox2" für den Adapternamen sein soll? Ich würde sie txtAdapter nennen.

Ähnliches bei "private void button6_Click_1"... da würd ich wahnsinnig werden. Bei einem "private void btnCancel_Click" weiß ich schon beim ersten Hingucken, wofür der Code ist... bei "button6" dagegen wird das schwer.

Aber ist vielleicht auch Geschmackssache, ich bin eher der ordnungsliebende Typ :evil: