每个控件var的null异常

时间:2019-05-09 00:49:03

标签: vb.net

在此代码块中,(tvn.Tag)出现空指针异常:

For Each tvn In SelNode.Nodes
    If tvn.Tag = "Ports" Then tvn.Remove()
Next

这怎么可能? 完整子:

Private Sub btnScan_Click(sender As Object, e As EventArgs) Handles btnScan.Click
        MGlobals.OpenPorts.Clear()
        Dim SelNode As TreeNode = TreeView1.SelectedNode
        Dim tvn As TreeNode

        For Each tvn In SelNode.Nodes
            If tvn.Tag = "Ports" Then tvn.Remove()
        Next
        tvn = SelNode.Nodes.Add("Portas Abertas")
        tvn.Tag = "Ports"

        tvn.Nodes.Add(tvn.Parent.Text)

        TreeView1.Select()
        TreeView1.SelectedNode = SelNode
    End Sub

2 个答案:

答案 0 :(得分:3)

通常,如果您在枚举该集合时尝试从集合中删除某个项目,则将抛出集合修改后的异常。但是,TreeNodeCollection类和它使用的枚举器没有实现这种逻辑。删除节点后,将通过复制较高索引的节点以填充已删除的节点来压缩后备阵列。如果数组最初过大,则意味着最高索引位置的位置现在为空。由于枚举器在创建时设置了节点总数,因此不幸地它充当了for-next循环,最终可能返回空值。

解决方案与从其他集合中删除项目时的解决方案相同,请使用递减的For-Next循环。

For i As Int32 = SelNodes.GetNodeCount(False) - 1 To 0 Step -1
    Dim tvn As TreeNode = SelNodes.Nodes.Item(i)
    If tvn.Tag IsNot Nothing AndAlso tvn.Tag.ToString = "Ports" Then
        tvn.Remove()
    End If
Next

答案 1 :(得分:0)

Tag属性是类型object,在投射或调用.ToString之前检查对象是否为Nothing。如果您知道它是字符串,则还必须照此将其抛弃。

    If tvn.Tag IsNot Nothing Then
        If CType(tvn.Tag, String) = "Ports" Then tvn.Remove()
    End If