Member 10202625 Ответов: 1

Как разрешить исключение null refernce в C# winforms


Как разрешить исключение null refernce
при вызове метода tu = obj.chkActiveTimer(ownerID); выбрасывается исключение.Он работает в течение некоторого времени, а затем выбрасывает исключение
private void tmr_Tick(object sender, EventArgs e)
       {
           try
           {

               tmr.Stop();
               DataTable dt = new DataTable();

               if (ownerID != null && ownerID != 0)
               {
                   tu = obj.chkActiveTimer(ownerID);
                   dt = tu.TimerUtilityDt;
               }
               tmr.Start();



               if (dt.Rows.Count > 0)
               {

                   if (flag == 0 && !_timerRunning)
                   {
                       if (dt.Rows[0]["ON_TIMER"].ToString() == "Y")
                       {

                           _startTime = DateTime.Now;
                           _totalElapsedTime = _currentElapsedTime;
                           _currentElapsedTime = TimeSpan.Zero;
                           if (linkUT.Text == "Project Task")
                           {
                               changeUTType();
                           }

                           flag = flag + 1;
                           comboBox1.Text = obj.getProName(dt.Rows[0]["project_ref_id"].ToString());
                           //   comboBox1_SelectedIndexChanged(this, EventArgs.Empty);
                           cbTaskList.ValueMember = "REF_ID";
                           cbTaskList.DisplayMember = "SCOPE_DETAILS";
                           //cbTaskList.DataSource = dt;
                           cbTaskList.SelectedValue = dt.Rows[0]["ref_id"].ToString();
                           comboBox1.Enabled = false;
                           cbTaskList.Enabled = false;
                           linkUT.Enabled = false;


                           _timer.Start();

                           btnTimer.Text = "STOP";

                           this.btnTimer.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
                           this.btnTimer.FlatAppearance.MouseOverBackColor = System.Drawing.Color.Transparent;
                           btnTimer.BackgroundImage = ETimerUtility.Properties.Resources.stop_btn;
                           _currentElapsedTimeDisplay.Visible = true;

                       }
                   }
               }

               else
               {
                   flag = 0;
                   linkUT.Enabled = true;

                   comboBox1.Enabled = true;
                   cbTaskList.Enabled = true;
                   _timer.Stop();
                   _totalElapsedTime = TimeSpan.Zero;
                   _currentElapsedTime = TimeSpan.Zero;
                   string taskID = cbTaskList.SelectedValue.ToString();
                   if (taskID != "0" && taskID != "-1" && taskID != "-2" && projectID != "0" && projectID != "" && projectID != null)
                   {
                       lblAllocHrs.Visible = lblUsedHrs.Visible = true;

                       tu = obj.CalculateHrs(projectID, taskID, ownerID);
                       dt = tu.TimerUtilityDt;
                       if (dt.Rows.Count > 0)
                       {
                           lblAllocHrs.Text = lblUsedHrs.Text = "";
                           lblAllocHrs.Text = "Allocated Hrs" + " : " + dt.Rows[0]["allocatedhrs"].ToString();
                           lblUsedHrs.Text = "Used Hrs" + " : " + dt.Rows[0]["usedhrs"].ToString();
                       }
                   }
                   btnTimer.BackgroundImage = ETimerUtility.Properties.Resources.start_btn;
                   btnTimer.Text = "START";
                   this.btnTimer.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
                   this.btnTimer.FlatAppearance.MouseOverBackColor = System.Drawing.Color.Transparent;
                   _currentElapsedTimeDisplay.Text = "00";
                   _lblCurrentElapsedTimeMin.Text = "00";
                   _lblCurrentDisplayTimeSec.Text = "00";
               }
               dt.Dispose();

           }


           catch (Exception ex)
           {
               MessageBox.Show(ex.Message);
           }
       }


Что я уже пробовал:

How to resolve null refernce exception 
when calling a method  tu = obj.chkActiveTimer(ownerID); throwing exception.It works for some time and then throws exception 

Richard MacCutchan

Вам нужно использовать свой отладчик, чтобы выяснить, почему obj равен null. Не всегда полезно использовать нелокальные ссылки внутри обработчиков событий.

Graeme_Grant

Я собирался написать почти то же самое! :)

Michael_Davies

Что такое null, tu или obj, используйте отладчик, чтобы увидеть, какой элемент является null, и работайте оттуда, трудность в попытке помочь вам заключается в том, что оба являются глобальными переменными, объявленными, созданными и управляемыми в другом месте вашего кода, которые мы не можем видеть.

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

1 Ответов

Рейтинг:
2

OriginalGriff

Это одна из самых распространенных проблем, которые нам задают, и это также та, на которую мы меньше всего готовы ответить, но вы больше всего готовы ответить сами.

Позвольте мне просто объяснить, что означает ошибка: вы пытались использовать переменную, свойство или возвращаемое значение метода, но оно содержит null - что означает, что в переменной нет экземпляра класса.
Это немного похоже на карман: у вас есть карман в рубашке, в котором вы держите ручку. Если вы сунете руку в карман и обнаружите, что там нет ручки, вы не сможете подписать свое имя на листе бумаги - и вы получите очень забавный вид, если попытаетесь! Пустой карман дает вам нулевое значение (здесь нет ручки!), поэтому вы не можете сделать ничего, что обычно делали бы, когда извлекли свою ручку. Почему он пуст? Вот в чем вопрос - может быть, вы забыли взять ручку, когда уходили из дома сегодня утром, или, возможно, вы оставили ручку в кармане вчерашней рубашки, когда снимали ее вчера вечером.

Мы не можем сказать, потому что нас там не было, и, что еще важнее, мы даже не можем видеть вашу рубашку, не говоря уже о том, что находится в кармане!

Вернемся к компьютерам, и вы каким - то образом сделали то же самое-и мы не можем увидеть ваш код, а тем более запустить его и узнать, что содержит null, когда это не должно быть.
Но вы можете - и Visual Studio поможет вам здесь. Запустите свою программу в отладчике, и когда она выйдет из строя, VS покажет вам строку, на которой она обнаружила проблему. Затем вы можете начать просматривать различные его части, чтобы увидеть, какое значение равно null, и начать просматривать свой код, чтобы выяснить, почему. Поэтому поставьте точку останова в начале метода, содержащего строку ошибки, и снова запустите программу с самого начала. На этот раз VS остановится перед ошибкой и позволит вам изучить, что происходит, пройдя через код, глядя на ваши значения.

Но мы не можем этого сделать - у нас нет вашего кода, мы не знаем, как его использовать, если бы он у нас был, у нас нет ваших данных. Так что попробуйте - и посмотрите, сколько информации вы сможете узнать!


Member 10202625

Сэр, я пытался это выяснить .Я вызываю сервисный метод на ТИКе таймера каждую секунду .Во первых он работает отлично но через некоторое время выдает ошибку

OriginalGriff

Мы не можем сделать это за вас - вам нужно использовать отладчик, чтобы узнать, что такое null, а затем посмотреть, почему. У нас нет ваших данных для работы, поэтому мы не можем дублировать вашу проблему! И если вы не можете воспроизвести проблему, вы не можете ее исправить...

Ralf Meier

Вопрос, который ведет вас к цели, был задан Майклом Дэвисом : "что такое null, tu или obj" - вы не ответили на это-и я полагаю, что вы также не искали этого.
В свой код вы смотрите только в том случае, если у вас есть идентификатор владельца.
Итак ... возможно, вы попытаетесь выяснить, что происходит с этими обоими объектами и почему один из них равен нулю ...

OriginalGriff

А для этого ему нужно использовать отладчик ... :смеяться:

Ralf Meier

Конечно... ни слова против того, что ты написал ... Я только пытался указать оператору направление ... ;-)

И... Я не могу понять, почему в наши дни люди больше не используют отладчик ...