【问题标题】:object reference not set to an instance of object [duplicate]对象引用未设置为对象的实例[重复]
【发布时间】:2010-09-12 23:06:18
【问题描述】:

我在 VB .Net 中遇到错误

对象引用未设置为对象的实例。

你能告诉我这个错误的原因是什么吗?

【问题讨论】:

  • 如果您可以发布生成此错误的代码文件会很好
  • 发布代码,这样我们就不会在黑暗中拍摄了;或者至少描述一下发生了什么!
  • 请添加您的代码

标签: vb.net


【解决方案1】:

对象在使用前没有被初始化。

在代码文件类型的顶部:

Option Strict On
Option Explicit On

【讨论】:

  • 选项显式,对于那些可能不知道的人,强制声明变量。这意味着,如果您对变量名加粗,编译器不会假定您打算创建另一个变量,并且会报错。 Option Strict 意味着如果你想翻译变量的类型,那么你将手动完成。
【解决方案2】:

sef, 如果问题出在数据库返回结果上,我认为是在这种情况下:

   dsData = getSQLData(conn,sql, blah,blah....)
   dt = dsData.Tables(0)  'Perhaps the obj ref not set is occurring here

解决这个问题:

  dsData = getSQLData(conn,sql, blah,blah....)
   If dsData.Tables.Count = 0 Then Exit Sub
   dt = dsData.Tables(0)  'Perhaps the obj ref not set is occurring here

编辑:添加代码格式化标签...

【讨论】:

  • 您可能希望为此答案使用代码格式化标签。
【解决方案3】:

让我们解构错误信息。

“对象引用”是指您在代码中使用的引用对象的变量。对象变量可能已由您声明,或者您可能只是使用在另一个对象中声明的变量。

"instance of object" 表示对象是空白的(或者在 VB 中,“Nothing”)。当您处理对象变量时,您必须在引用它之前创建该对象的instance

“未设置为”表示您尝试访问一个对象,但其中没有任何内容可供计算机访问。

如果你创建一个像

这样的变量
Dim aPerson as PersonClass

你所做的只是告诉编译器 aPerson 将代表一个人,而不是 what 人。

您可以使用“新建”关键字创建对象的空白副本。例如

Dim aPerson as New PersonClass

如果你希望能够通过测试查看对象是否“无”

If aPerson Is Nothing Then
    aPerson = New PersonClass
End If

希望有帮助!

【讨论】:

    【解决方案4】:

    一般来说,在 .NET 运行时,每当取消引用未赋值或赋值为 Nothing(在 VB.Net 中为 null 在 C# 中)的变量时,就会发生这种情况。

    Option Strict OnOption Explicit On 将有助于检测可能发生这种情况的实例,但可能会从另一个函数调用中获取 null/Nothing:

    Dim someString As String = someFunctionReturningString();
    If ( someString Is Nothing ) Then
       Sysm.Console.WriteLine(someString.Length); // will throw the NullReferenceException
    End If
    

    NullReferenceException 是“对象引用未设置为对象实例”的来源。

    【讨论】:

      【解决方案5】:

      如果您认为数据库查询没有返回数据时会发生这种情况,那么您是否应该在对其进行操作之前测试结果?

      Dim result As String = SqlCommand.ExecuteScalar()   'just for scope'
      If result Is Nothing OrElse IsDBNull(result) Then
          'no result!'
      End If
      

      【讨论】:

        【解决方案6】:

        您可以在应用程序中加入日志记录机制,以便隔离错误原因。 Exception 对象具有 StackTrace 属性,该属性是一个描述调用堆栈内容的字符串,最近的方法调用首先出现。通过查看它,您将获得有关可能导致异常的原因的更多详细信息。

        【讨论】:

          【解决方案7】:

          在使用数据库时,当您尝试从不存在的字段或行中获取值时,您可能会收到此错误。即,如果您正在使用数据集并且您使用:

          Dim objDt as DataTable = objDs.Tables("tablename")
          

          如果数据集中不存在表名,则会得到对象“未设置对象实例的引用”。数据集中的行或字段也是如此。

          【讨论】:

            【解决方案8】:

            嗯,错误正在自我解释。由于您没有提供任何代码示例,我们只能在您的代码中的某处说,您正在为某些任务使用 Null 对象。我在下面的代码示例中遇到了同样的错误。

            Dim cmd As IDbCommand
            cmd.Parameters.Clear()
            

            如您所见,我将清除一个空对象。为此,我收到错误

            “对象引用未设置为对象的实例”

            检查您的代码中是否存在此类代码。由于您没有给出代码示例,我们无法突出显示代码:)

            【讨论】:

              【解决方案9】:

              如果你有一个类属性和多个构造函数,你必须在所有构造函数中初始化属性。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2020-11-17
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2021-12-03
                • 2013-11-17
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多