【问题标题】:how to solve Object reference not set to an instance of an object in asp.net [duplicate]如何解决对象引用未设置为asp.net中的对象实例[重复]
【发布时间】:2018-02-01 09:09:23
【问题描述】:
 protected void Page_Load(object sender, EventArgs e)
        {


         num = Convert.ToInt32(Request.QueryString["RegNo"].ToString());
            if (!IsPostBack)
            {
                BindTextBoxvalues();
            }    
        }

这里会显示错误: 对象引用未设置为对象的实例

【问题讨论】:

  • 加个断点,调试一下!看看哪一行抛出了错误。
  • 在您的代码中某处您试图获取一个空值的属性。您能否发布堆栈跟踪,以便我们查看错误发生在哪一行?
  • 您的代码有多个问题,从不使用属性,不检查查询字符串是否为空,不检查数据表是否有任何记录,不使用正确的列命名,不使用 Sql 参数,不处理 sql 连接,sqlDataAdapter。
  • 是的,我放了一个断点并确定发生了哪个部分错误。
  • 您的查询字符串可能为空.ToString() 抛出错误

标签: c# asp.net


【解决方案1】:

首先您需要检查查询字符串参数是否为空。然后,您需要在尝试转换之前检查该值是否实际上是一个整数。为此,您可以使用方法Int32.TryParse。如果该值是可转换为 int 的,它会同时为您进行转换。

例如:

if (Request.QueryString["RegNo"] != null) {
  int num = 0; 
  bool parseResult = Int32.TryParse(Request.QueryString["RegNo"].ToString(), out num);
  if (parseResult == true) {
    //valid number, so continue
    if (!IsPostBack)
    {
      BindTextBoxvalues();
    }    
  }
  else {
    //do something suitable here like display an error message or throw an exception, or continue without executing this particular piece of functionality, whatever is necessary for your application
  }
else {
    //do something suitable here like display an error message or throw an exception, or continue without executing this particular piece of functionality, whatever is necessary for your application
}

有关详细信息和更多示例,请参阅https://msdn.microsoft.com/en-us/library/f02979c7(v=vs.110).aspx

【讨论】:

    【解决方案2】:

    您可以使用以下方法来避免异常。

    var regNo = Request.QueryString["RegNo"];
    if(!string.IsNullOrEmpty(regNo) && IsDigitsOnly(regNo.ToString().Trim()))
    {
     num = Convert.ToInt32(regNo.ToString());
    }
    
    private bool IsDigitsOnly(string str)
    {
        foreach (char c in str)
        {
            if (!char.IsDigit(c))
            {
                return false;
            }
        }
    
        return true;
    }
    

    【讨论】:

    • 值得注意的是,虽然这适用于这种情况(因为数据库中的 RegNo 可能始终为正数),但从技术上讲,这并不能严格验证字符串是否可解析为 int,因为它将不允许负整数(例如“-100”)。所以它不能作为检查整数的通用验证程序重复使用。使用内置的 TryParse 方法也可能效率较低
    • @Adyson TryParse 不会阻止空引用异常。如果RegNo 没有查询字符串值,那么ToString() 将在TryParse 之前给出空引用异常
    • @KiranKG regNo.ToString() 无需再次致电ToString(),因为它已经是string
    • @Bharadwaj 你是对的,我已经修改了我的答案。谢谢。
    • 它有效。我改变了我的编码。
    猜你喜欢
    • 2017-02-24
    • 2013-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-24
    • 2020-11-05
    • 1970-01-01
    • 2010-09-12
    相关资源
    最近更新 更多