2012-01-22 7 views
3
public partial class Form1 : Form 
{ 
    string[] id; 

private void button_Click(object sender, EventArgs e) 
{ 
    char[] delimiters = { ',', '\r', '\n' }; 
    string[] content = File.ReadAllText(CSV_File).Split(delimiters); 

    int x = content.GetUpperBounds(0) 
    int z = 0; 
    int i - 0; 

    for (i = 0; i <= x/3; i++) 
     { 
      z = (i * 3); 
      id[i] = content[z]; // this line gives the error 
     } 

} 
} 

配列の内容から3番目ごとに値を取得し、配列IDに入れたいと考えています。これは、 'NullReferenceExceptionが未処理'のエラーを示し、 'new'を使用することを示唆していますが、型または名前空間ではありません。私はここで何をすべきですか?このNullReferenceExceptionはどのように処理するのですか?

これらは両方とも文字列配列であり、最初の実行時にエラーが発生するため、境界を超えているとは思われません。

+0

「x」が3で割り切れない場合は、境界を越えてしまいます。 –

+0

これで苦労しています:p私はあなたに尋ねてみませんか? –

+0

@Shredder - すべての言語には把握する必要がある基本的な概念があり、質問は自動的に「愚か」ではありません。なぜなら、ポスターはまだ概念を把握していないからです。一部の言語(MATLABなど)では、コード 'id [i] = content [z]'の行が自動的に 'id'変数を割り当ててサイズを変更することに注意してください。 –

答えて

2

このコード行:

string[] id; 

が実際に null参照を作成しています。

配列を宣言するときは、配列を明示的に作成してサイズを指定する必要があります。

あなたの例では、次の2つの選択肢

  1. を持つ配列は、事前になり、そして独自のサイズを管理し、コンテナを移入実際には配列の長さ
  2. が作成されますどのように大きな決定します。

最初のオプション:

int x = content.GetUpperBounds(0) 
int z = 0; 
int i - 0; 

id = new string[x/3]; 
for (i = 0; i <= x/3; i++) 
    { 
     z = (i * 3); 
     id[i] = content[x]; 
    } 

番目のオプション:

int x = content.GetUpperBounds(0) 
int z = 0; 
int i - 0; 

List<string> list = new List<string>(); 
for (i = 0; i <= x/3; i++) 
    { 
     z = (i * 3); 
     list.Add(content[z]); 
    } 

id = list.ToArray(); 

あなたが1つのオブジェクトのみを割り当てていると、最初のオプションは、パフォーマンスが向上します。

確かに、私はパフォーマンスを無視し、第2のオプションを使用する傾向があります。

4

あなたがforループの前にid配列を初期化する必要があります。

id = new string[x/3]; 
+0

ああクール、ありがとう!あなたはそれをしなければならないことを気づかなかった。 –