试图在c#中处理NullReferenceException

时间:2015-08-10 15:51:12

标签: c# debugging nullreferenceexception

我正在开发一个基于控制台的应用程序,该应用程序将通过电子邮件向应用程序用户发送电子邮件,其中包含尝试使用移动应用程序的客户的问题描述。我目前正在尝试的是设置电子邮件代码。我遇到的唯一问题是当我尝试运行它时,它一直告诉我,我有一个空的引用异常。以下是我正在尝试使用的代码。它应该做的是循环遍历此列表中的所有事务,如果它已修复,则不会发生任何事情。否则它将进行交易,将其与网站上的用户信息相匹配,然后将其全部放入字符串中,以便我们将其放入电子邮件中。

问题就在于此 myHomeBody = matchRecords.ToString();当我在调试中完成它时,我得到了我需要的值DashSupportMonitorBO.TransactionInformation.UserName.get返回,但在matchRecords我需要该值的地方,它会变为null。

那么有没有办法可以获得该值并将其移动到匹配记录中,或者只是一种简单的方法来解决这个问题,我只是完全失踪了?

foreach (TransactionInformation transaction in recentFailedTransactions)
{
     string displayErrorBody;
     string myHomeBody;
     if (TransactionSuccessFound(transaction))
     {
         BOAssistant.WriteLine("Transaction fixed");
     }
     else
     {
         displayErrorBody = transaction.DisplayException.ToString();
         MyHomeInformation matchRecords = GetUserDataFromMyHome(transaction.UserName);   
         myHomeBody = matchRecords.ToString();
         string emailBody = "Here is the displayErrorBody: \n" + displayErrorBody + "Here is all the user information regarding the error: \n" + myHomeBody;
         BOAssistant.WriteLine(emailBody);
         SendEmail(emailBody, "Errors in Dash Mobile");
     }
 }

以下是GetUserDataFromMyHome的代码

 private static MyHomeInformation GetUserDataFromMyHome(string username)
    {
        MyHomeInformation myHomeInformation = null;
        using (SqlConnection connection = new SqlConnection(Properties.Settings.Default.MyHomeConnectionString))
        {
            SqlCommand sqlError = connection.CreateCommand();
            sqlError.CommandText = @"SELECT USER_NAME, EMAIL, FIRST_NAME, LAST_NAME, TRAVELER_UID FROM [USER] WHERE USER_NAME = @USER_NAME";
            sqlError.Parameters.Add("@USER_NAME", System.Data.SqlDbType.VarChar).Value = username;
            connection.Open();
            SqlDataReader reader = sqlError.ExecuteReader();

            if(reader.Read())
            {
                myHomeInformation = new MyHomeInformation();
                myHomeInformation.myHomeUserName = Utilities.FromDBValue<string>(reader["USER_NAME"]);
                myHomeInformation.myHomeEmail = Utilities.FromDBValue<string>(reader["EMAIL"]);
                myHomeInformation.myHomeFirstName = Utilities.FromDBValue<string>(reader["FIRST_NAME"]);
                myHomeInformation.myHomeLastName = Utilities.FromDBValue<string>(reader["LAST_NAME"]);
                myHomeInformation.myHomeTravelerUID = (Utilities.FromDBValue<Guid>(reader["TRAVELER_UID"])).ToString();
            }
        }
        return myHomeInformation;
    }

2 个答案:

答案 0 :(得分:0)

GetUserDataFromMyHome返回null,而不是transaction.UserName。也许这意味着没有找到数据或存在其他错误。

这意味着matchRecords将被分配null,您无法在ToString上致电null。如果GetUserDataFromMyHome可以返回null,只需确保正确处理null结果 - 如果没有,请找出它返回null的原因。

答案 1 :(得分:0)

由于还没有得到50分,我无法添加评论,但是您的评论表明它有效,这表明您调用了另一种方法。错误表明,当您调用GetUserDataFromMyHome时,它不返回任何内容,因此在您正在讨论的行上失败。在调试时,您需要确保传递给您的方法的transaction.UserName具有值,并且可能显示方法中的代码,因为这是问题。在您尝试设置myHomeBody之前的两种情况下,您应该执行一些防御性编码,并在尝试使用之前首先检查matchRecords是否为null。