【问题标题】:VB.net classes - Object reference not set to an instance of an object?VB.net 类 - 对象引用未设置为对象的实例?
【发布时间】:2013-03-13 13:05:15
【问题描述】:

我正在开发一个给我带来麻烦的 VB 应用程序。来自 Java 和 C++,VB 的类语法是奇特的。我有我的主要表单,以及我创建的一个名为WebElement 的类。我将该类导入MainForm.vb 并声明了一个WebElement 的数组。当我尝试设置或获取 'WebElement` 数组的第一个元素的 Name 属性时,它给了我一个错误 - “对象引用未设置为对象的实例?” 这是什么意思,我该如何解决?

代码
MainForm.vb

Imports MyProgram.WebElement

Public Class MainForm

    Private webpage(0 To 9) As WebElement
    Private pageNum As Integer = 0

    Private Sub openFile() Handles OpenToolStripMenuItem.Click
        webpage(pageNum).setName("rawr")
        MsgBox(webpage(pageNum).getName())
    End Sub

End Class

WebElement.vb

Public Class WebElement

    Private Name As String

    Public Function setName(ByRef n As String)
        Name = n
    End Function

    Public Function getName()
        Return Name
    End Function

End Class

【问题讨论】:

    标签: arrays vb.net class object instance


    【解决方案1】:

    您不会用WebElements 填充您的数组,您只需告诉它需要的大小。所以webpage(pageNum) 是一个空对象。

    试试

    Private Sub openFile() Handles OpenToolStripMenuItem.Click
        webpage(pageNum) = New WebElement()
        webpage(pageNum).setName("rawr")
        MsgBox(webpage(pageNum).getName())
    End Sub
    

    【讨论】:

    • 酷,它有效。那么,它之前没有工作,因为我实际上并没有声明所有的对象?我只是告诉它我需要该类的 10 个元素?
    • @JoshI,对不起,我不能尽快回复你。我希望你得到你需要的答案。
    【解决方案2】:

    VB.NET 中的类语法可能比较奇特,但类的用法与 Java 和 C++ 非常相似。

    特别是,type 类的 定义 (您在 WebElement.vb 中编写并导入到您的 MainForm.vb 代码文件中)之间存在差异),以及该类类型的 object。后者是您缺少的那个。

    您需要在代码中创建(实例化)WebElement 类类型的对象。您现在声明的数组是空的(即它的所有元素都是空的)。你所做的只是声明它。除非您要求编译器这样做,否则编译器不会创建并填充对象。

    您需要使用新对象初始化数组中的元素。您可以使用New 关键字来执行此操作。语法如下:

    webpage(0) = New WebElement()   ' initializes the first element in the array
                                    ' with a new WebElement object
    

    如果您愿意,也可以在声明数组元素时内联初始化它。为了让这个魔法发生,你省略了声明左侧的大小,并在右侧使用了一个初始化列表,如下所示:

    Dim webpage() As WebElement = {
                                   New WebElement(),
                                   New WebElement(),
                                   New WebElement(),
                                   New WebElement(),
                                   New WebElement(),
                                   New WebElement(),
                                   New WebElement(),
                                   New WebElement(),
                                   New WebElement(),
                                   New WebElement()
                                  }
    

    但是这种语法对于长数组来说非常笨拙,所以大多数人更喜欢在声明和创建对象后立即循环遍历数组的元素。

    【讨论】:

      【解决方案3】:

      这一行

       Private webpage(0 To 9) As WebElement
      

      声明一个包含 10 个元素的数组,其类型应为 WebElement。
      数组中不存在任何元素。所以每个插槽都是空的(在 C# 中为 null)。
      在 null 元素上调用方法将产生 NullReferenceException

      您应该在调用该方法之前检查您的元素,如果它为空,则创建该元素并将其分配给所需的插槽

      Private Sub openFile() Handles OpenToolStripMenuItem.Click
          if webpage(pageNum) Is Nothing Then
             webpage(pageNum) = new WebElement()
          End If
          webpage(pageNum).setName("rawr")
          MsgBox(webpage(pageNum).getName())
      End Sub
      

      顺便说一句,为什么不尝试使用 NET 语法来实现类属性

      Public Class WebElement
      
          Private Name As String
          Public Property Name() As String
              Get
                  Return Name
              End Get
              Set(ByVal value As String)
                  Name = value
              End Set
          End Property
      End Class
      

      然后在你的代码中使用它

       webpage(pageNum).Name = "rawr"
       MessageBox.Show(webpage(pageNum).Name)
      

      【讨论】:

      • 好吧,这是有道理的,我猜。我认为通过使用setName() 函数我让它包含一些东西,因此不是空的或“无/空”。真奇怪。
      • 首先是创建 WebElement 实例,然后,您将对象放在内存中,您可以调用方法并针对实例设置/获取属性。看看@cody gray的回答,对概念的描述非常准确
      【解决方案4】:

      你已经创建了webpage数组,但是它的所有元素都是空的,所以webpage(pageNum).setName("rawr")取消引用一个空对象

      【讨论】:

        【解决方案5】:

        这意味着 NullPointerException 因为对象尚未初始化,就像在 java 中一样。

        试试

        Private webpage(0 To 9) As New WebElement

        【讨论】:

          猜你喜欢
          • 2013-01-14
          • 2011-09-22
          • 1970-01-01
          • 1970-01-01
          • 2014-02-15
          • 1970-01-01
          • 2022-12-05
          • 2013-12-30
          • 1970-01-01
          相关资源
          最近更新 更多