System.NullReferenceException; Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.

3 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Das passiert weil bei dir toSplit nicht initialisiert wurde - will heißen toSplit ist null (setz einfach man nen Breakpoint in die Zeile und schau nach ;)

Wenn du über das if testweise mal

string toSplit = "Ich bin ein Teststring";

schreibst müsste es gehen (das string kannst du weg lassen wen der string bereits weiter oben definiert wurde). Übrigens ist es nicht nötig extra ein neues char Array anzulegen..

split = toSplit.Split(' ');

düfte ausreichen.

rj45abqz 
Fragesteller
 29.06.2013, 21:06

doch, steht nur weiter oben:

string toSplit;

toSplit = lineArray[i, 0];
0
rj45abqz 
Fragesteller
 29.06.2013, 21:10

hier einfach mal alles, bevor ich wieder was vergess:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        string line;
        string[,] lineArray = new string[50, 16];

        public Form1()
        {
            InitializeComponent();
        }

        private void open_Click(object sender, EventArgs e)
        {
            openFileDialog1.ShowDialog();
        }

        private void openFileDialog1_FileOk(object sender, CancelEventArgs e)
        {
            System.Diagnostics.Debug.WriteLine("1");

            int i = 0;
            int j = 1;
            string toSplit;

            System.IO.StreamReader file = new System.IO.StreamReader(@openFileDialog1.FileName);

            System.Diagnostics.Debug.WriteLine("2");

            while ((line = file.ReadLine()) != null && i <= 49)
            {
                lineArray[i, 0] = line;
                System.Console.WriteLine(line);
                i++;
            }

            file.Close();

            i = 0;

            while (i <= 49)
            {
                j = 1;

                toSplit = lineArray[i, 0];

                string[] split = new string[1000];

                if (split != null)
                {
                    split = toSplit.Split(new Char[] { ' ' });
                }

                foreach (string s in split)
                {
                    if (s.Trim() != "")
                    {
                        lineArray[i, j] = s;
                        System.Diagnostics.Debug.WriteLine(lineArray[i, j]);
                        j++;
                    }
                }

                i++;
            }
        }
    }
}
0
IIIsamIII  29.06.2013, 21:30
@rj45abqz

Ok, bei der Befüllung deines lineArrays passiert es hier, dass der gesamte eingelesene string unter dem platz [0,0] gespeichert wird. Der Durchlauf der der Schleife

 while (i <= 49)

funktioniert daher nur beim ersten mal, da die Split funktion nur hier tatsächlich Werte findet. Sobald der nächste Schleifendurchlauf beginnt [1,0] ist der String null und die Funktion läuft ins Leere.

0
IIIsamIII  29.06.2013, 21:37
@IIIsamIII

Ähm.. Korrektur.. natürlich wird das lineArray schon auch auf anderen Plätzen mit Werten belegt, allerdings nicht für alle Plätze im Array da offenbar .ReadLine() nicht ausreichende Zeilen vorfindet und daher die Schleife vorzeitig abgebrochen wird. Das Problem tritt daher auf, sobald diese nicht-initialisierten Plätze erreicht werden.

0
WhiteGandalf  29.06.2013, 21:56
@IIIsamIII

Ich würde es ja auf die Verarbeitung der Spalten mit dem "j" schieben: Er hat keinen Grenztest drin.

Sobald das foreach auf eine Spalte trifft, deren Index > 15 ist, schlägt die Sache fehl.

Ich hege die Vermutung, daß in der gelesenen Textdatei (oder was auch immer) 16 Spalten existieren.

Da müßte dann nur die Dimensionierung um eins aufgebohrt werden.

Ansonsten: Das Zeug in Java nachgestellt (und leicht vereinfacht, weil ein paar Sachen überflüssig sind) läuft durch - wenn die Eingangsdaten stimmen.

2
IIIsamIII  29.06.2013, 22:03
@WhiteGandalf

Als Lösungsansatz würde ich vorschlagen das Array statt mit null einfach mit Leerstrings zu belegen. Dann wird die Schleife durchlaufen auch wenn keine Daten hinterlegt sind.. kommt eben drauf an, was man hier überhaupt erreichen will.

Konkret würde ich also bereits im Konstruktor der Form sagen:

public Form1()
{
   InitializeComponent();
   for (int i = 0; i < 50; i++)
   {
       for (int j = 0; j < 16; j++)
       {
           lineArray[i, j] = "";
       }
   }
}
0
IIIsamIII  29.06.2013, 22:18
@IIIsamIII

Das was @WhiteGandalf sagt ist übrigens richtig. Meine Anmerkung dürfte zwar bei dem in der Frage genannten Problem helfen, aber wenn der Fall auftritt, dass mehr strings in split enthalten sind als 16, dann wird die Anwendung in der foreach ebenfalls eine Nullpointer Exception werfen.

0
rj45abqz 
Fragesteller
 29.06.2013, 22:29
@IIIsamIII

also ich möchte damit die daten aus einem 3d modell einlesen dabei sollen einfach alle zahlen aus der datei die durch leerzeichen getrennt sind einzeln in variablen gespeichert werden

0
IIIsamIII  30.06.2013, 00:58
@rj45abqz

Also nochmal in der Übersicht..

Wenn du meinen Vorschlag implementierst dann kann die Datei die du einliest weniger als 50 Zeilen enthalten und auch weniger Werte pro Zeile als von Array gefordert. Wenn du dann noch die von Gandalf implementierst was z.B. so aussehen könnte:

 if (s.Trim() != "" && j < 16)

Dann kannst du auch Dateien einlesen bei denen mehr als 15 Werte pro Zeile angegeben sind (15 deshalb, weil der Startwert nicht bei 0 liegt sondern explizit auf 1 gesetzt wurde .. daher ist unter 0 die gesamte Zeile incl. Leerzeichen gespeichert und von 1 bis 15 die einzelnen Teilstrings).

Am Ende hast du also ein lineArray bei dem in 50 Zeilen je 16 Strings stehen.. wenn mehr als 15 Werte in irhgend welchen Zeilen vorhanden waren wurden diese ignoriert und wenn weniger Zeilen oder Werte enthalten waren sind diese Felder mit Leerstrings belegt.

Die Frage ist nun also ist es das, was du wolltest? Es kommt eben darauf an, was du mit den Werten anfangen willst oder warum ausgerechnet ein Array mit der Größe [50,16] definiert wurde. Wenn das so gewollt ist dann dürfte das Problem jetzt erledigt sein.

Wenn aber genau die richtige Anzahl an Werten hätten erfasst werden sollen, dann eignet sich ein festes Array eher nicht - z.B. hätte man dann statdessen eine generische Liste nehmen können. Da du ein zweidimensionales Array hast würde hier eine Liste benötigt, die eine weitere Liste beihnhaltet (man hat also eine Liste von Zeilen welche jeweils aus einer Liste von Strings je Zeile bestehen). Das sieht dann so aus..

List<List<string>> lineList = new System.Collections.Generic.List<System.Collections.Generic.List<string>>();

du würdest dann für jede Zeile eine neue Liste aus strings erschaffen

List<string> currentLine = new System.Collections.Generic.List<string>();

jeden gefundenen Wert anhängen

lineList.Add(DeinString);

und am ende die ganze Liste (also alle Werte der Zeile) an die äußere Liste anhängen

lineList.Add(currentLine);

Zum Befüllen sowie Auslesen immer mit foreach arbeiten.

Hth und gut N8

0
IIIsamIII  30.06.2013, 01:03
@Michael339

Tatsächlich. Das Problem ist scheinbar schon 3 Wochen alt ^^ Wäre nett da mal ein + zu geben oder @rj45abqz ganz vorbildlich wäre es dort noch eine eigene Platzhalterantwort zu verfassen, damit die einzelne Antwort als hilfreichste ausgewählt werden kann.

2
Michael339  03.07.2013, 16:48
@IIIsamIII

Richtig klasse dieser Typ. Wieder einmal kein Feedback, was es denn nun ist.

0
rj45abqz 
Fragesteller
 04.07.2013, 21:11
@Michael339

wie gesagt hab vergessen mich nochmal zu melden, aber das war nicht das selbe problem, denn das hier trat erst auf als das andere behoben war.

0

Du hast die Frage ja bereits schon einmal gestellt (http://www.gutefrage.net/frage/systemindexoutofrangeexpection-c) und dann jegliche Antwort verweigert. Wir opfern auch unsere Zeit! Daher empfinde ich es als frech, jetzt noch einmal die anderen um Hilfe zu bitten.

Daher sinngemäß noch einmal: Du hast doch schon System.Diagnostics.Debug.WriteLine("2"); verwendet. Verwende doch innerhalb Deiner Schleifen noch einmal diesen Befehl und gib die Werte der Schleifen/Array-Zähler noch einmal aus und vielleicht ergibt sich dann die Stelle, wo es hakt. Bist Du sicher, dass toSplit.Split() immer ein Array von 16 Feldern ergibt oder vielleicht doch irgendwann mehr? Ist ein tosplit vielleicht an einer Stelle null? Anstatt System.Diagnostics.Debug.WriteLine(lineArray[i, j]); gib mal die werte von i und j aus. Wenn Du möchtest, kannst Du ja auch gern mal eine Datendatei zur Verfügung stellen. Den Code, den Du anwendest, kennen wir ja nun.

Michael339  29.06.2013, 23:41

toSplit.Split(new Char[] { ' ' }); darf eh nur 15 Felder ergeben, da Du mit "1" beginnst zu zählen...

0
rj45abqz 
Fragesteller
 04.07.2013, 21:09
@Michael339

ja, sorry dass ich mich nicht mehr gemeldet habe, aber es war zwar die selbe meldung, jedoch an einer anderen stelle, aber jetzt ist beides gelöst

0
Eddcapet  05.01.2018, 20:30

Weshalb so kompliziert? Einfach den Debugger verwenden.

0

Was mich an dieser Frage am meisten beeindruckt, ist der Umstand, daß bei Microsoft offenbar der englisch-deutsch-Übersetzer zwei Indizes in einer Fehlermeldungs-Vorlage vertauscht hat:

In <Exception-Type> ist eine Ausnahme vom Typ <Exe-Filename> aufgetreten.

statt

In <Exe-Filename> ist eine Ausnahme vom Typ <Exception-Type> aufgetreten.

Und dann diese gestelzte Ausdrucksweise, wenn es um einen Pointer geht:

Der >>Objektverweis<< wurde nicht auf eine Objektinstanz festgelegt.

...statt Klartext, den jeder Programmierer auch kapiert:

Dein Objekt-Pointer ist an dieser Stelle null, Du Dussel!

Ich finde, Microsoft sollte mal ein paar mutigere Programmierer zur linguistischen Anpassung an die unter Programmierern übliche Alltagssprache einstellen, keine akademisch verdongelten Juristen, die nicht mal die linke von der rechten Hand unterscheiden können!

Michael339  30.06.2013, 20:47

Klasse, darauf habe ich noch gar nicht geachtet... mein Fokus lag immer nur auf den relevanten Worten.

0
Michael339  30.06.2013, 22:57
@Michael339

^^ klingt überheblich, wollte nur sagen, auf die Reihenfolge habe ich noch gar nicht geachtet.

0