0

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

代码
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
4

5 回答 5

2

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

特别是,类类型的定义(您已经编写并导入到代码文件中)与该类类型的对象之间存在差异。后者是您所缺少的。WebElement.vbMainForm.vb

您需要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()
                              }

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

于 2013-03-13T13:14:36.480 回答
2

你不用 填充你的数组WebElements,你只告诉它它需要的大小。webpage(pageNum)空对象也是如此。

尝试

Private Sub openFile() Handles OpenToolStripMenuItem.Click
    webpage(pageNum) = New WebElement()
    webpage(pageNum).setName("rawr")
    MsgBox(webpage(pageNum).getName())
End Sub
于 2013-03-13T13:10:19.053 回答
1

这条线

 Private webpage(0 To 9) As WebElement

声明一个包含 10 个元素的数组,这些元素的类型应为 WebElement。
数组中不存在任何元素。所以每个插槽都是空的(在 C# 中为空)。
在 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)
于 2013-03-13T13:10:40.130 回答
0

That means NullPointerException because the objects haven´t been initialized, just like in java.

try

Private webpage(0 To 9) As New WebElement

于 2013-03-13T13:09:56.373 回答
0

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

于 2013-03-13T13:07:18.903 回答