azkarriyaz Ответов: 3

System.nullreferenceexception проблема в случайном порядке();


Привет,

Я пытаюсь сгенерировать случайное число и передать его из класса а в класс В С помощью сеанса

Класс А
public static void SendPwd(string Email)
{
    using (var client = new SmtpClient())
    {
        using (var message = new MailMessage(EmailFrom, Email))
        {
            Random rnd = new Random();
            var random = rnd.Next();
            if (random != null)
            {
                System.Web.HttpContext.Current.Session["random"] = random;
            }
            message.Subject = "Please Verify Your Account";
            message.Body = "<html><head><meta content=\"text/html; charset=utf-8\" /></head><body><p>Dear " + Email +
            ", </p><p>Please note the random Number and type in the Text box</p>" + "<p> Your Random Number is </p>" + random
            + "</a></p><div>Best regards,</div><div>Team</div><p>Do not forward "
            + "this email. The verify link is private.</p></body></html>";
            message.IsBodyHtml = true;
            client.EnableSsl = true;
            client.Send(message);
        };
    };
}

Класс В
var password = con.tblEmployees.Where(a => a.Emp_Email == user.EmailId).FirstOrDefault();
password.Emp_TempPwd = (int)HttpContext.Current.Session["random"];
con.SaveChanges();
return "success";

пока я это делаю, я получил эту ошибку

Исключение типа "System.NullReferenceException" произошло в ServerControl.dll, но не был обработан в пользовательском коде



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

Я искал в Google, чтобы найти его, но я не могу найти решение, поэтому любезно помогите мне решить эту проблему
заранее спасибо

CHill60

И на какой линии произошло это исключение?

azkarriyaz

http://prntscr.com/bmgejz

Philippe Mori

Очевидно, что вы должны использовать отладчик и должны предоставить полезную информацию, если вам нужна какая-то помощь.

В вашем коде класса В Мы понятия не имеем, что это такое. con Кроме того, вы проверили, что пароль не является нулевым? Вы даже не говорите нам, на какой линии происходит исключение.

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

azkarriyaz

http://prntscr.com/bmgejz

azkarriyaz

использование (var con = новые пустоты())

3 Ответов

Рейтинг:
26

OriginalGriff

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

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

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

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

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


OriginalGriff

Дело не в том, что вы "спросили неподобающим образом", а в том, что проблему нужно рассматривать, пока она работает, и мы не можем запустить ее в тех же обстоятельствах, что и вы. У нас нет доступа к вашему полному коду или к данным, которые управляют вашим кодом. Таким образом, мы не можем обязательно дублировать вашу проблему - и если мы не можем дублировать ее, мы не можем сказать вам, что это неправильно! :смеяться:
Глядя на ваш скриншот, ясно, что "случайный" не является нулевым (он имеет значение 1219753436, и это целое число, которое все равно не может быть нулевым) - так что это должен быть другой код в строке. Скорее всего, это часть сеанса, которая возвращает null, вероятно, потому, что в ней нет ничего, что соответствовало бы "rd". Это означает, что где - то еще в вашем коде вы либо не устанавливаете его, либо очищаете-но, не имея возможности запустить всю вашу систему, мы не можем сказать точно.
Поэтому посмотрите на левую часть знака равенства, а затем начните смотреть на остальную часть вашего кода, чтобы узнать, почему он равен нулю.
И серьезно-мы не можем сделать это для вас, если только вы не готовы лететь с нами в Индию, чтобы мы могли наблюдать за вами через ваше плечо! (Что может быть довольно дорого: смейтесь:)

azkarriyaz

не могли бы вы удалить свои комментарии ??

Рейтинг:
19

azkarriyaz

protected void Application_PostAuthorizeRequest() 
{
System.Web.HttpContext.Current.SetSessionStateBehavior(System.Web.SessionState.SessionStateBehavior.Required);
}

добавлять
до глобального.эйсакс


Рейтинг:
0

Sergey Alexandrovich Kryukov

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

Не беспокоиться. Это один из самых простых случаев для обнаружения и исправления. Это просто означает, что некоторый член / переменная некоторого ссылочного типа разыменовывается с помощью и своих экземпляров (нестатических) членов, что требует, чтобы этот член / переменная не была нулевой, но на самом деле она кажется нулевой. Просто запустите его в отладчике; он остановит выполнение при возникновении исключения. Поставьте точку останова на этой строке, перезапустите приложение и снова перейдите к этой точке. Оцените все ссылки, включенные в следующую строку, и посмотрите, какая из них пустая, хотя она не должна быть нулевой. После того, как вы это выясните, исправьте код: либо убедитесь, что член / переменная правильно инициализирована ненулевой ссылкой, либо проверьте ее на null и, в случае null, сделайте что-нибудь еще.

Пожалуйста, смотрите также: хотите отобразить следующую запись при нажатии кнопки. но получил ошибку в том случае, если условие следующей функции записи "ссылка на объект не установлена на экземпляр объекта".

Иногда вы не можете сделать это под отладчиком по той или иной причине. Один действительно неприятный случай - это когда проблема проявляется только в том случае, если программное обеспечение построено, когда отладочная информация недоступна. В этом случае вам придется использовать более сложный способ. Во-первых, вам нужно убедиться, что вы никогда не блокируете распространение исключений, обрабатывая их молча (это преступление разработчиков против самих себя, но очень обычное). Вам нужно поймать абсолютно все исключения на самом верхнем кадре стека каждого потока. Вы можете сделать это, если будете обрабатывать исключения этого типа System.Exception В обработчике вам нужно записать всю информацию об исключениях, особенно System.Exception.StackTrace:
http://msdn.microsoft.com/en-us/library/system.exception.aspx,
http://msdn.microsoft.com/en-us/library/system.exception.stacktrace.aspx.

Трассировка стека - это просто строка, показывающая полный путь распространения исключения от оператора throw к обработчику. Читая его, всегда можно найти концы. Для ведения журнала лучше всего (в большинстве случаев) использовать класс System.Diagnostics.EventLog:
http://msdn.microsoft.com/en-us/library/system.diagnostics.eventlog.aspx.

Удачи,

—СА