你调用的对象是空的?但它是? C#

时间:2016-06-04 11:12:34

标签: c# object nullreferenceexception

新手编码器在这里。在Yahtzee的游戏中工作,但是当我已经纠正它时,无法弄清楚为什么我得到这个错误(对象引用未设置为对象的实例)。我的'form'对象是null,即使我在类构造函数中声明了它的一个实例,并且出现了一条绿线表示它没有被使用。

public partial class Form1: Form {

    public Form1() {
        InitializeComponent();
    }

    private Game game;

    public void ShowMessage(string message) {
        lblMessage.Text = message;
    }

    public void StartNewGame() {
        game = new Game(this);

        }

    private void btnRoll_Click(object sender, EventArgs e) {
        game.RollDice();

    }

class Game {
    private Form1 form;

    public Game(Form1 form) {
        form = new Form1();

        }

    public void RollDice() {

        form.ShowMessage("blahblah");
    }

在Form.ShowMessage上出现“NullReferenceException”错误,我不知道为什么。我在游戏构造函数中声明了一个表单类的新实例,当玩家选择运行StartNewGame方法的StartNewGame时运行该实例。让它工作的最简单方法是简单地将“Form1表单”添加到Game类中的RollDice()方法的参数,然后在Form1事件处理程序中添加game.RollDice(this)。但是赋值的指令指出我们不应该这样做,我们要在Game的构造函数中初始化Form1对象。请帮助我是新手,不能理解为什么会这样。

4 个答案:

答案 0 :(得分:1)

在构造函数Game Class中使用它:

public Game(Form1 form)
{
    this.form = form;

}

答案 1 :(得分:1)

您的问题是构造函数中的命名冲突:

public Game(Form1 form)
{
    form = new Form1();
}

该参数与表单级变量的名称相同。这意味着构造函数代码是new你传入的变量,而不是类级别的变量。您应该使用this限定符引用表单变量,或者最好重命名它。

通常的做法是对类级变量使用下划线前缀:

class Game
{
    private Form1 _form;

    public Game(Form1 form) {
        _form = new Form1();

    }
}

答案 2 :(得分:0)

您正在创建新表单,而不是将传入的表单分配给其本地变量。

class Game {
    private Form1 form;

    public Game(Form1 form) {
        *form = new Form1();*

        }

    public void RollDice() {

        form.ShowMessage("blahblah");
    }

您应该更改代码,以便将传入的表单分配给其本地变量,如下所示:

public Game(Form1 form) {
    this.form = form;

    }

然后它应该工作。

答案 3 :(得分:0)

不要让您的Game班级了解正在调用它的Form。这确实限制了代码在将来的可重用性,因为现在尝试使用Form类的任何 Game都必须使用ShowMessage方法来调用

相反,只需让您的RollDice方法返回一个字符串......

class Game
{
    public void RollDice()
    {
        // do important 'roll dice' stuff...

        return "blahblah";
    }
}

然后让Form正确处理返回值。

private void btnRoll_Click(object sender, EventArgs e)
{
    string message = game.RollDice();

    lblMessage.Text = message;
}

这完全解决了将Form传递到Game课程的需要,并避免了获得NullReferenceException的大量机会。