ページ 11

「nullreferenceexceptionはハンドルされませんでした」の意味と改善方法

Posted: 2014年11月01日(土) 21:38
by たろたろす
[1] 質問文
 [1.1] 自分が今行いたい事は何か
  配列 Noto[]に格納された文字列をランダムに選択し、それを配列Gene[]に格納していきます。その後、格納された配列Gene[]の中身を出力したいと考えています。
 [1.2] どのように取り組んだか(プログラムコードがある場合記載)

コード:

 
using System;

public class GeneType
{
    public string[] Gene = new string[8];
    public int Fitness;
}

class Compose
{
    public static void Main()
    {
        Random random = new Random();

        GeneType[] Individual = new GeneType[50];

        string[] Note = {"休符","ド1","ド#1","レ1","レ#1","ミ1","ファ1","ファ#1","ソ1","ソ#1","ラ1","ラ#1","シ1",
                            "ド1","ド2", "ド#2","レ2","レ#2","ミ2","ファ2","ファ#2","ソ2","ソ#2","ラ2","ラ#2","シ2",
                            "ド3","ド#3","レ3","レ#3","ミ3","ファ3"};

        for (int i = 0; i < 50; i++)
        {
            for (int j = 0; j < 8; j++)
            {
                int RandomNumber = random.Next(Note.Length);
                Individual[i].Gene[j] = Note[RandomNumber];
            }
            Console.WriteLine("{0}", Individual[i].Gene);
        }
    }
}
 
 [1.3] どのようなエラーやトラブルで困っているか(エラーメッセージが解る場合は記載)
   デバッグを行うと、Individual.Gene[j] = Note[RandomNumber]; の部分で、「nullreferenceexceptionはハンドルされませんでした」と表示されます。
   また、プログラムを実行すると、「ハンドルされていない例外: System.NullReferenceException: オブジェクト参照がオブ ジェクト インスタンスに設定されていません。」と表示され、実行できません。
 [1.4] 今何がわからないのか、知りたいのか
   このエラーメッセージの意味、また、どのように改善すると配列Gene[]の中身が出力されるようになるのでしょうか。

[2] 環境  
 [2.1] OS : Windows
 [2.2] コンパイラ名 : VC# 2010 Express

[3] その他
C#は勉強を始めて3か月程度の未熟者で質問内容もわかりにくいとは思いますが、回答を頂けるととても助かります。

Re: 「nullreferenceexceptionはハンドルされませんでした」の意味と改善方法

Posted: 2014年11月01日(土) 21:46
by みけCAT
Javaの場合、

コード:

GeneType[] Individual = new GeneType[50];
と書いた場合、IndividualにはGeneTypeを入れるための「箱」が50個確保されますが、
そこに入れるGeneTypeクラスのオブジェクトは生成されず、「箱」は最初は空です。
したがって、そのまま例えばIndividual[0]のメンバにアクセスしようとすると、NullPointerExceptionになります。

C#でも同じような現象が起きているとすれば、23行目の直後に

コード:

Individual[i] = new GeneType();
というコードを実行し、GeneTypeオブジェクトを生成して「箱」に格納すると改善するかもしれません。

Re: 「nullreferenceexceptionはハンドルされませんでした」の意味と改善方法

Posted: 2014年11月02日(日) 23:27
by たろたろす
返信ありがとうございます。

ご指摘いただいた箇所を修正したところ、上手く動作しました。
何か根本的なところから勉強不足なようですね。
これからも頑張って勉強していきたいと思います。
ありがとうございました_(._.)_