Исключение NullReferenceException не обработано, для ссылки на объект не задан экземпляр объекта - PullRequest
3 голосов
/ 15 мая 2009

Всякий раз, когда я запускаю свою программу, я получаю: NullReferenceException не обрабатывается, Ссылка на объект не устанавливается на экземпляр объекта.

Когда я запускаю программу, у меня появляется форма MaxScore, где пользователь вводит максимальный балл и нажимает ОК. В случае события ОК я вызываю метод из MainForm для обновления maxGameCountLabel в MainForm со значением, введенным для максимальной оценки, в качестве параметра.

Когда я нажимаю ОК, я получаю исключение NullReferenceException в

myGameCountLbl.Text = maxGames.ToString();

моего метода maxGameCountLblUpdate.

Вот код метода maxGameCountLblUpdate, который находится в MainForm:

//Update game count label 
public void maxGameCountLblUpdate(decimal maxGames)
{
    maxGames = decimal.ToInt32(maxGames);
    myGameCountLbl.Text = maxGames.ToString();
    compGameCountLbl.Text = maxGames.ToString();
}

Вот мое событие OK Button на MaxScore:

private void okBtn_Click(object sender, EventArgs e)
{
    MainForm.maxGameCountLblUpdate(max);
}

Обратите внимание, я установил

public Form1 MainForm { get; set; }

в MaxScore

И я создаю MaxScore в MainForm с:

    using (MaxScore scoreForm = new MaxScore())
    {
        scoreForm.MainForm = this;
        scoreForm.ShowDialog();
    }

Я не могу заставить это работать .. Я пробовал много вещей .. Спасибо!

РЕДАКТИРОВАТЬ: после добавления точки останова на myGameCountLbl.Text = maxGames.ToString (); myGameCountLbl выглядит как нулевой ... Извините, что я новичок ... Как мне это исправить? На самом деле maxGames имеет значение 1, так что это не проблема

Ответы [ 5 ]

4 голосов
/ 15 мая 2009

Хорошо, если эта строка вызывает проблему:

myGameCountLbl.Text = maxGames.ToString();

тогда либо myGameCountLbl равно нулю, либо maxGames равно. Учитывая, что maxGames является десятичным числом, это говорит о том, что myGameCountLbl является нулем.

Что происходит, когда вы отлаживаете это и ставите точку останова на соответствующей строке? Что это показывает для myGameCountLbl?

2 голосов
/ 15 мая 2009

Вы удалили: InitializeComponent(); из конструктора?

Если вы используете дизайнер для создания пользовательского интерфейса формы, Visual Studio создает метод в фоновом режиме (Class.designer.cs) для инициализации элементов управления. Если вы не вызовете InitializeComponent() до доступа к элементам пользовательского интерфейса, вы получите исключение NullReferenceException.

1 голос
/ 15 мая 2009

Вы также можете сделать разрыв Visual Studio для всех исключений или разрыв для всех исключений NullReferenceException, а затем вы можете проверить, что происходит.

(Отладка -> Исключения -> Исключения общего времени выполнения ...)

0 голосов
/ 19 июня 2012

Я знаю, что это было опубликовано давным-давно, но я столкнулся с той же проблемой, и вот как я решил ее.

Если вы посмотрите на советы по устранению неполадок, второй предлагает:

Проверьте, чтобы определить, является ли объект нулевым, перед вызовом метода.

Это на самом деле решение. Использование оператора IF для проверки, не является ли значение, которое должно быть присвоено, нулевым, например:

if (maxGames!=null){
      myGameCountLbl.Text = maxGames.ToString();
}

Это позволит вам избежать присвоения пустого значения myGameCounLbl

Надеюсь, это поможет

0 голосов
/ 15 мая 2009

Почему бы вам не поставить точку останова в этой строке и не отладить текущее состояние обоих объектов? Откуда здесь Макс?

MainForm.maxGameCountLblUpdate (макс);

...