2016-08-13 6 views
0

基本的にTextAssetを使用してDictionaryを埋めようとしていますが、処理中に「IndexOutOfRangeException:Arrayインデックスが範囲外です。なぜ私はUnity 5のVisual studio Communityを使用しています。また、私は4ヶ月前にプログラミングを学び始めたばかりで、正に何が問題なのかを知りません。 ..array.Subitを使用して辞書を塗りつぶすときに配列インデックスが範囲外になる

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は、これらのテストラインを持っています

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

もう一つは、Visual Studioがtext.Splitラインに波線でitemListの(TextAsset)を下線とツールチップを表示し続ける、あります可能なSystem.NullReferenceException。しかし、単一性はnull参照に関するエラーをまったく表示しません。

とにかく、助言をいただければ幸いです。

+0

デバッガで例外をスローする行にブレークポイントを置き、アプリケーションを実行します。私は 'data'が2要素未満であると確信しています。これは、少なくとも1つの '行'に ':'が含まれていないためです。あなたのデバッガで 'itemList'の内容を見てください。 –

+0

ありがとう!私はそれが単純だったとは信じられない、それは最後に空の行があったからだ!しかし、とにかく、その問題を回避する方法はありますか?コードが空行を無視するようにするには?推測すると、私はフォーラムで一見しなければならないでしょう、または私は "ピギーバック"の質問を叱られるつもりです。とりあえずありがとう。 –

答えて

1

使用この:

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

これは、任意の空を削除します:

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

素晴らしいですが、私は両方の提案を使用します! –

+0

ああ、ちょうど1つのことですが、項目名の隣にある数字は、実数がどうなるかを完全に表すものではありません。実数は、aで作られたいくつかのグローバル変数を指すID番号になります。第三者資産(Unity Asset Adventureクリエイター)が存在する可能性は低いです。どのようにコードを適応させるのですか?私はまだそれを試していないが、それはコードが外観の順番で単語を置くことを意味する印象を与える(これは前に言及していない私の間違いです)。 –

+0

このコードを動作させるために番号が必要なわけではありません。しかし、あなたが "ID番号"と言うとき、私は 'Items'が' new Dictionary () 'であるべきだと思っていて、' Items.Add(i、data [0] .Trim()) 'を使うべきです。 –

1

第二引数を受け取るオーバーロードを使用してあり、データ内の余分な空の要素であることが、あなたがSplitを呼び出すときかもしれませんあなたのデータの行

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

これにより、t結腸の前後には何もありません。

また、結果data配列は要素に対処しようとする前に、2の長さを持っていることを確認する必要があります:

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 
} 

その後のデータは、あなたがそれがあることを期待するものになります。

+0

行が空ではなく、 ':'が含まれていない場合でも、これは 'NullReferenceException'をスローします。 –

+0

@DourHighArch true。 – ChrisF

関連する問題