2013-03-13 103 views
0

我正在研究一个VB中的应用程序,它给了我一些麻烦。从Java和C++来看,VB的类语法是独特的。我有我的主要形式,我创建了一个名为WebElement的课程。我将这个类导入了MainForm.vb并宣布了一个WebElement的数组。当我尝试设置或获取“WebElement”数组的第一个元素的Name属性时,它给我一个错误 - “未将对象引用设置为对象的实例?”这是什么意思,我该如何解决?VB.net类 - 对象引用未设置为对象的实例?

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

回答

1

此行

Private webpage(0 To 9) As WebElement 

声明10个元素应该是类型W​​ebElement的阵列。
阵列中没有元素存在。所以每个插槽都是Nothing(C#中为空)。
调用空元素上的方法会给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) 
+0

好吧,我想是有道理的。我认为通过使用'setName()'函数我使它包含了某些东西,因此不能为空或“nothing/null”。真奇怪。 – 2013-03-13 13:15:58

+0

首先要创建WebElement实例,然后将内存中的对象包含在内存中,并且可以针对实例调用方法和设置/获取属性。从@cody灰色看这个概念的精确描述 – Steve 2013-03-13 13:20:13

0

您已经创建webpage数组,但它的所有元素为null,所以webpage(pageNum).setName("rawr")取消引用空对象

0

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

尝试

Private webpage(0 To 9) As New WebElement

+0

我也这么认为。给我一个错误。 – 2013-03-13 13:10:56

2

你不WebElements填写您的数组,你只告诉它它需要什么尺寸。所以webpage(pageNum)是一个空对象。

尝试

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

很酷,它的工作原理。所以,它之前没有工作,因为我实际上并没有宣布所有的对象?我只是在说,我需要该班的10个元素? – 2013-03-13 13:13:51

+0

@JoshI,很抱歉,我无法尽快回复您。我希望你能得到你需要的答案。 – 2013-03-13 16:54:15

2

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

尤其是有定义一个类(你写了一首歌WebElement.vb并导入到你的MainForm.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() 
           } 

但是这句法得到相当笨拙长数组,所以最人们更喜欢在声明和创建对象之后立即循环数组的元素。

相关问题