2016-08-13 1 views
0

Grundsätzlich versuche ich ein Wörterbuch mit einem TextAsset zu füllen, aber dabei bekomme ich immer eine "IndexOutOfRangeException: Array-Index ist außerhalb des Bereichs." von einem der Arrays und ich bin mir nicht sicher, warum ... Ich benutze Visual Studio Community in Unity 5, auch habe ich erst vor 4 Monaten mit dem Programmieren begonnen und ehrlich gesagt keine Ahnung, was das Problem sein könnte. ..Array-Index außerhalb des Bereichs beim Füllen eines Wörterbuchs mit text.Split

public Dictionary<string, string> Items = new Dictionary<string, string>(); 

Start(){ 
var itemList = Resources.Load("ItemList", typeof(TextAsset)) as TextAsset; 

     //populating the Dictionaries using previous text assets. Line by Line. 
     //Populating Dictionary with Text Asset with format Item:Id. The ':' symbol separates lines into columns 
     string[] rows = itemList.text.Split('\n'); 
     foreach (string row in rows) 
     { 
      string[] data = row.Split(':'); 
      Items.Add(data[0].Trim(), data[1].Trim()); //exception is thrown in this line 
     } 
} 

ItemList.txt hat diese Testlinien:

Health Potion:1 
Mana potion:2 
Beet:3 
Poisonous Beet:4 
Cheese Slice:5 

eine andere Sache ist, hält Visual Studio itemList (TextAsset) mit einer Wellenlinie in der text.Split Linie und zeigt den Tooltip unterstrichen : Mögliche System.NullReferenceException. Aber die Einheit zeigt überhaupt keine Fehler in Bezug auf Null-Referenzen.

Wie auch immer, jeder Rat würde sehr geschätzt werden.

+0

Setzen Sie einen Haltepunkt auf die Zeile, die die Ausnahme im Debugger auslöst, und führen Sie Ihre App aus. Ich wette, Daten haben weniger als 2 Elemente. Denn mindestens eine Zeile enthält kein ':'. Sehen Sie sich den Inhalt von 'itemList' in Ihrem Debugger an. –

+0

Hey danke! Ich kann nicht glauben, dass es so einfach war, weil es am Ende eine leere Linie gab! Aber, gibt es einen Weg, um dieses Problem zu umgehen? Um den Code leere Zeilen zu ignorieren? Ich denke, ich muss in den Foren nachsehen, oder ich werde wegen "Huckepack" -Fragen gequält. Trotzdem danke. –

Antwort

1

verwenden:

public Dictionary<string, int> Items = new Dictionary<string, int>(); 
... 
string[] rows = itemList.text.Split('\n'); 
foreach (string row in rows) 
{ 
    string[] data = row.Split(':'); 
    int i; 
    if (data.Length > 1 && int.TryParse(data[1].Trim(), out i)) 
     Items.Add(data[0].Trim(), i); 
} 
+0

Toll, ich werde beide Vorschläge dann verwenden! –

+0

Oh, es gibt nur eine Sache, obwohl die Zahlen neben den Elementnamen nicht vollständig repräsentativ dafür sind, was die reellen Zahlen sein werden ... Die reellen Zahlen werden Id-Nummern sein, die auf einige globale Variablen zeigen, die in a gemacht wurden Drittanbieter-Assets (Unity Asset Adventure-Ersteller), so dass sie wahrscheinlich nicht in Ordnung sind. Wie würde ich den Code dafür anpassen? Ich habe es noch nicht ausprobiert, aber es gibt mir den Eindruck, dass der Code dazu gedacht ist, die Wörter in die richtige Reihenfolge zu bringen (was mein Fehler ist, dies vorher nicht zu erwähnen). –

+0

Die Zahlen müssen nicht in Ordnung sein, damit dieser Code funktioniert. Wenn Sie jedoch "ID-Nummern" sagen, vermute ich, dass 'Items'' 'new Dictionary ()' sein sollte und Sie 'Items.Add (i, data [0] .Trim())' verwenden sollten. –

1

Es könnten zusätzliche leere Elemente werden so in Ihre Daten, wenn Sie anrufen Split die Überlastung verwenden, die ein zweites Argument:

string[] rows = itemList.text.Split('\n', StringSplitOptions.RemoveEmptyEntries); 

Dies wird eine leere entfernen Zeilen in Ihrem Daten

string[] data = row.Split(':', StringSplitOptions.RemoveEmptyEntries); 

Diese alle Fälle, in denen t entfernen wird hier ist nichts vor oder nach dem Doppelpunkt.

Sie sollten auch prüfen, ob der resultierende data Array mit einer Länge von 2 hat, bevor Sie versuchen, die Elemente zu adressieren:

if (data.Length == 2) 
{ 
    Items.Add(data[0].Trim(), data[1].Trim()); 
} 
else 
{ 
    // Deal with the error - could be as simple as ignoring it or logging the dodgy data 
} 

Dann werden die Daten sein, wie Sie es erwarten sein.

+0

Beachten Sie, dass weiterhin "NullReferenceException" ausgelöst wird, wenn eine Zeile nicht leer ist, aber kein ':' enthält. –

+0

@DourHighArch wahr. – ChrisF

Verwandte Themen