Haseeb47 Ответов: 4

Я столкнулся с ошибкой nullreferenceexception в настольном приложении C#


Я буду краток, я делаю простое настольное приложение C# для продуктового магазина. И вот, в моей задаче, сценарий таков::
если пользователь упоминает количество, которое меньше количества в запасе, приложение выполняет вычисления; и если пользователь запрашивает количество, которое больше количества в текущем запасе, то программа уведомляет пользователя, что это так, и вы все еще хотите продолжить? если да: приложение выполняет те же вычисления; а если нет, то приложение не выполняет и не очищает текстовые поля.

все сценарии работают нормально, за исключением блока "да". если говорит система.Исключение NullReferenceException: объекта не задана ссылка на экземпляр объекта. И ссылается на строку: 708. (Я вставил код ниже). Эта строка является точной копией той же самой строки, что и в блоке IF. Но там все работает нормально, а здесь-нет. Интересно, почему?




if (data.Rows.Count > 0)
                       {
                           quantity = Convert.ToInt32(data.Rows[0]["item_stock_qty"]);
                       }

                       if (quantity>=Convert.ToInt32(txtBoxQuantity.Text))
                       {
                           AddDataToGridView1((++srNo).ToString(), comboBoxItems.SelectedItem.ToString(),
                               txtBoxUnitPrice.Text.ToString(), txtBoxDiscountPerItem.Text.ToString(),
                               txtBoxQuantity.Text.ToString(), txtBoxSubTotal.Text.ToString(),
                               txtBoxTax.Text.ToString(), txtBoxTotalCost.Text.ToString());
                           ResetControls();
                           CalculateFinalCost();
                       }
                       else
                       {
                           DialogResult dialogResult= MessageBox.Show("The remaining stock of this item is "+quantity+
                               " item/s. Do you still want to Continue?", "Low Stock", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
                           if(dialogResult== DialogResult.Yes)
                           {//below is line 708
                               AddDataToGridView1((++srNo).ToString(), comboBoxItems.SelectedItem.ToString(),
                                   txtBoxUnitPrice.Text.ToString(), txtBoxDiscountPerItem.Text.ToString(),
                                   txtBoxQuantity.Text.ToString(), txtBoxSubTotal.Text.ToString(),
                                   txtBoxTax.Text.ToString(), txtBoxTotalCost.Text.ToString());
                               ResetControls();
                               CalculateFinalCost();
                           }
                           else if(dialogResult== DialogResult.No)
                           {
                               ResetControls();
                           }
                           else { }
                       }

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


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

I have been trying to solve this problem sleeplessly but haven't been able to do so. please help. Thank you

4 Ответов

Рейтинг:
5

Dave Slama

Если вы еще не поняли этого, надеюсь, это поможет вам разобраться.
Вы должны быть в состоянии прочитать текстовое свойство Combobox, если выбран элемент. Свойство SelectedItem возвращает только объект внутренней коллекции. Поэтому вместо этого я рекомендую сделать что-то более похожее

comboBoxItems.Items[comboBoxItems.SelectedIndex].ToString()

или
comboBoxItems.Text

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

кстати: я согласен с Дэйвом на 100%. Свойство Text - это строковое значение. Вызов функции ToString() для строкового значения никогда не требуется и довольно небрежен. Ваше здоровье!


Haseeb47

Спасибо!!! Это сработало для меня. Сначала я сохранил индекс выбранного элемента в отдельной переменной с помощью comboBoxItem.SelectedIndex. а затем использовал эту переменную в блоке YES. и это сработало!!:) большое спасибо

Рейтинг:
32

Dave Kreskowiak

Во - первых, моя любимая обида. Зачем ты звонишь?ToString() в текстовом поле.Свойства текста? ЭТО УЖЕ ВЕРЕВКА!! Вот что возвращает свойство Text!

Исключение NullReferenceException возникает потому, что ваш код делает предположения о том, что вещи работают или возвращают данные, когда это не так. Переменная не содержит ничего или равна нулю. Вы не можете вызывать методы или получать/устанавливать свойства для объектов, которые не существуют или являются нулевыми.

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

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


Haseeb47

Я запустил отладчик и сделал так, как вы посоветовали, и обнаружил, что combobox1.selecteditem.get вернул null.
Я не знаю, почему он равен нулю или как его исправить, потому что этот элемент в данный момент выбран; так как же он может быть равен нулю. все остальные вычисления основаны на выбранном элементе этого выпадающего списка.

OriginalGriff

Учитывая, что вы не показываете нам этот код, мы не можем сказать! :смеяться:

Но я бы предположил, что разные блоки кода выполняются в разное время: один раз метод вызывается, когда он равен нулю, и один раз, когда это не так. Но, как я уже сказал, Мы не можем сказать отсюда!

Haseeb47

Могу ли я поделиться кодом всей этой формы в комментарии?

Dave Kreskowiak

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

Рейтинг:
2

Richard MacCutchan

Скорее всего, в вашем выпадающем списке нет выбранного элемента - см. комбинированный список.Свойство SelectedItem (System.Окна.Формы) | Microsoft Docs[^].


Рейтинг:
0

OriginalGriff

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

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

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

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

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


Haseeb47

Thankyou for your well explanation :) and i got the point what you said. I did the debugging procedures and found where the problem is happening. What its saying is that, in the YES block: the combobox.selecteditem is appearing null, this is the reason. But the strange thing is, this same code that is in the YES block, it is also in the previous case i.e. the IF block. There is not that problem, how come the combobox.selecteditem is not null there; and it is null just here, when the distance is just a block away. I'm not getting how to resolve this because the both blocks have the same instructions from the background; the first one is working fine, whereas the latter isn't.