VB.net类 - 对象引用未设置为对象的实例?

时间:2013-03-13 13:05:16

标签: arrays vb.net class object instance

我正在使用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

5 个答案:

答案 0 :(得分:2)

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

尝试

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

答案 1 :(得分:2)

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

特别是,类类型定义之间存在差异(您已在WebElement.vb中编写并导入到{{1}代码文件),以及该类类型的对象。后者是你失踪的那个。

您需要在代码中创建(实例化)MainForm.vb类类型的对象。您现在声明的数组是空的(即,它的所有元素都为null)。你所做的只是声明它。在您要求它执行此操作之前,编译器不会创建对象并将其填充。

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

New

如果您愿意,也可以在声明时初始化数组元素。为了实现这种魔力,你可以省略声明左侧的大小,并使用右侧的初始化列表,如下所示:

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

但是对于长数组,这种语法变得相当笨重,所以大多数人更喜欢在声明和创建对象后立即循环遍历数组的元素。

答案 2 :(得分:1)

这一行

 Private webpage(0 To 9) As WebElement

声明一个包含10个元素的数组,这些元素应该是WebElement类型 数组中没有元素。所以每个插槽都是Nothing(在C#中为null) 在null元素上调用方法将给出NullReferenceException

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

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)

答案 3 :(得分:0)

您已创建webpage数组,但其所有元素均为空,因此webpage(pageNum).setName("rawr")取消引用空对象

答案 4 :(得分:0)

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

尝试

Private webpage(0 To 9) As New WebElement