【问题标题】:Confusing System.NullReferenceException error on a defined variable - VB定义变量上令人困惑的 System.NullReferenceException 错误 - VB
【发布时间】:2012-07-26 14:09:13
【问题描述】:

好的,所以我是新来的,所以如果我发布不正确或有点含糊,我提前道歉。我的问题是,当我尝试运行我的代码时遇到了NullReferenceException,但是在调试并将鼠标悬停在有问题的变量上时,我确实看到了变量的值。

这是我正在使用的 VB 代码:

Private Sub Login_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles login.Click
    status.Text = "Connecting...."

    WebBrowser2.Navigate("http://*****.com/?op=login")
    WebBrowser2.Document.GetElementById("loginUsername").InnerText = username.Text
    WebBrowser2.Document.GetElementById("loginPassword").InnerText = password.Text
    WebBrowser2.Document.GetElementById("loginSubmit").InvokeMember("click")

End Sub

这里是正在发生的事情的快照:

------------ 编辑:解决方案 --------

    WebBrowser2.Url = New Uri("http://*****.com/?op=login")
    WaitForPageLoad() ' <---------- ADDED NEW FUNCTION TO WAIT FOR PAGE LOAD

    WebBrowser2.Document.GetElementById("loginUsername").InnerText = username.Text
    WebBrowser2.Document.GetElementById("loginPassword").InnerText = password.Text
    WebBrowser2.Document.GetElementById("loginSubmit").InvokeMember("click")

    status.Text = "Completed"

所以我创建了一个名为 WaitForPageLoad() 的新函数(归功于 How to wait until WebBrowser is completely loaded in VB.NET? 中的 BGM),它基本上循环检查页面是否准备就绪,然后一旦准备就绪,就会被杀死处理程序,因此登录成功并且页面不会循环。这是 WaitForPageLoad():

Private Property pageready As Boolean = False

Private Sub WaitForPageLoad()
    AddHandler WebBrowser2.DocumentCompleted, New WebBrowserDocumentCompletedEventHandler(AddressOf PageWaiter)
    While Not pageready
        Application.DoEvents()
    End While
    pageready = False
End Sub

Private Sub PageWaiter(ByVal sender As Object, ByVal e As WebBrowserDocumentCompletedEventArgs)
    If WebBrowser2.ReadyState = WebBrowserReadyState.Complete Then
        pageready = True
        RemoveHandler WebBrowser2.DocumentCompleted, New WebBrowserDocumentCompletedEventHandler(AddressOf PageWaiter)
    End If
End Sub

【问题讨论】:

  • @Mr.Alien 不再是了 ;)
  • @Polynomial 那时我没有重新标记选项 ;)
  • @Mr.Alien Hehe,这就是拥有大量代表的好处。无论如何,我将您的编辑标记为有用:)
  • 其他人已经回答了这个问题,但值得注意的是,您的屏幕截图中的工具提示不是有问题的变量。这是您分配给 null,而不是您分配的来源。

标签: vb.net exception


【解决方案1】:

WebBrowser2.Navigate 需要一些时间来加载文档,但它是异步的。这意味着下一个代码在文档完成加载之前执行。

因此,在下一行中,GetElementById 还找不到目标元素并返回 Nothing。为防止这种情况,您无法在调用 Navigate 后执行代码——相反,您需要为文档加载完成后触发的事件创建一个事件处理程序,然后执行代码那里。 – 这是DocumentCompleted event

【讨论】:

  • 这正是问题所在!一旦创建了一个等待页面加载的函数,就会找到空元素并且代码执行得很好。谢谢。
【解决方案2】:

特别是在那条线上……

  • Document 可以是 null
  • GetElementById("loginUsername") 的结果可能是null

【讨论】:

    【解决方案3】:

    为什么你认为username 是空的?

    我打赌WebBrowser2.Document.GetElementById("loginUsername") 会返回null

    另一种可能性是Document 为空。

    【讨论】:

      猜你喜欢
      • 2019-05-23
      • 2018-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-15
      • 2011-04-16
      • 2012-09-12
      • 1970-01-01
      相关资源
      最近更新 更多