-1

重複の可能性:
.NET の NullReferenceException とは?

簡単なプログラムを開発しています。Form1 から配列リストを受け取り、その内容を form2 に表示すると、このエラーが発生します..教えてください..コーディングは次のようになります..

FORM1.cs..........

public partial class Form1 : Form
{
    ArrayList alcar;
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        string name = textBox1.Text; ; int quantity = int.Parse(textBox2.Text);
        car c = new car(name, quantity);
        if (alcar != null)
        {
            alcar.Add(c);
        }
        else
        {
            alcar = new ArrayList();
            alcar.Add(c);
        }
        Form2 f2 = new Form2();
        f2.Show();
    }
    public ArrayList getArray()
    {
     return alcar;
    }    
}
class car
{
    string name; int quantity;
    public string NAME
    {
        get { return name; }
        set { name = value; }
    }
    public int QUANTITY
    {
        get { return quantity; }
        set { quantity = value; }
    }
    public car(string n, int q)
    {
        name = n; quantity = q;
    }
}

FORM2.cs.................................

public partial class Form2 : Form
{
    ArrayList al;
    public Form2()
    {
        Form1 f1 = new Form1();
        if (al != null)
        {
            al = f1.getArray();
        }
        else
        {
            al = new ArrayList();
            al = f1.getArray();
        }

        InitializeComponent();
        foreach (car c in al)        // this lne is causing error
        {
            label1.Text = c.NAME;
            label2.Text = Convert.ToString(c.QUANTITY);
        }
    }

}
4

7 に答える 7

4

f1.getArray()を返す場合null、それは私が期待する例外です。

しかし、問題はここにあります:

// In Form2
Form1 f1 = new Form1();

これにより、車を作成したインスタンスではなく、新しい Form1インスタンスが作成されます。配列には何もありません。この新しいインスタンスでは、初期化alcarまたは設定することはないためnull、デフォルトで設定されています。このnullオブジェクトを取得して反復しようとすると、エラーが発生します。

設計を再考して、配列を 2 番目のフォームに (カスタム コンストラクターまたはプロパティのいずれかで) 直接渡します。

于 2011-07-26T20:00:55.327 に答える
1

フィールド宣言自体を記述してみませんかnew。これにより、コードが大幅に簡素化されます。

public partial class Form1 : Form
{

    ArrayList alcar = new ArrayList(); // DO THIS HERE!

    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        string name = textBox1.Text; ; int quantity = int.Parse(textBox2.Text);
        car c = new car(name, quantity);

        //JUST ADD - without checking for null!
        alcar.Add(c);

        Form2 f2 = new Form2();
        f2.Show();
    }
    public ArrayList getArray()
    {
         return alcar; //its non-null - guaranteed!
    }
    //...
 }
于 2011-07-26T20:04:08.847 に答える
0

Form2のコンストラクターでForm1の新しいインスタンスを作成すると、そのUIが表示されることはなく、したがってクリックされることもありません。したがって、al = f1.getArray();と言います。Form2のコンストラクターでは、null参照を返します。

新しいものを作成する代わりに、すでに存在するForm1の参照を使用します。

于 2011-07-26T20:03:16.753 に答える
0

ボタンがクリックされない限り、ArrayListalcarはForm1でインスタンス化されません。Form1のGetArrayメソッドでnullをチェックし、alcarをインスタンス化する必要があります。または、Form1のコンストラクターでalcarをインスタンス化します。

于 2011-07-26T20:03:28.297 に答える
0

Form2では、Form1の新しいインスタンスを作成します。 Form1 f1 = new Form1();

alcarその特定のインスタンスに対して開始したことはありません。ユーザーがbutton1をクリックしたForm1のインスタンスを取得する必要があります。

于 2011-07-26T20:04:10.623 に答える
0

これを試して

public ArrayList getArray()
{
    if(null == alcar)
         alcar = new ArrayList();

    return alcar;
}
于 2011-07-26T20:04:10.717 に答える
0

ArrayList alcar; 要素なしで作成され、GetArray()を呼び出すと、nullが返され、Form1で作成できるソリューションの1つとして例外があります。

        Form2 f2 = new Form2(alcar);
        f2.Show();

そしてform2で

     ArrayList al = new ArrayList();
     public Form2(ArrayList  alcar)
     {
         al = alcar;
         InitializeComponent();
于 2011-07-26T20:05:12.653 に答える