即使检查Nothing,也会抛出NullReferenceException

时间:2013-08-26 07:53:44

标签: vb.net nullreferenceexception nothing

我有一些相当简单的比较函数代码

    Public Overridable Function Comparer(thisValue As Object, otherValue As Object) As Integer
    Try
        If thisValue Is Nothing Then
            If otherValue Is Nothing Then
                Return 0
            Else
                Return -1
            End If
        Else
            If otherValue Is Nothing Then
                Return 1
            Else
                Return thisValue.ToString.CompareTo(otherValue.ToString)
            End If
        End If
    Catch ex As Exception
        Return 0
    End Try
End Function

try-catch块的原因是:如果thisValue为Nothing,我会在实际的比较行中得到NullReferenceException。调试器向我显示thisValue是“Nothing”,但无论如何都会进入ELSE分支。

谁能告诉我为什么?

更新: 我试图通过插入另一个Nothing检查来修改这种情况。在我的场景中,这归结为几百个例外,执行速度是可以忍受的。不要想象有人试图对空列进行排序。

http://i.stack.imgur.com/8dnXD.png

这怎么可能?还有另一种我不知道的虚无“水平”。我需要检查thisValue和otherValue的类型吗?

函数永远不会被覆盖。我试过删除“Overridable”没有效果。

1 个答案:

答案 0 :(得分:3)

也许thisValue不是Nothing,而.ToString()正在返回Nothing的事实?试试这段代码吧:

Public Overridable Function Comparer(thisValue As Object, otherValue As Object) As Integer
    Try
        If thisValue Is Nothing Then
            If otherValue Is Nothing Then
                Return 0
            Else
                Return -1
            End If
        Else
            If otherValue Is Nothing Then
                Return 1
            Else

                Dim thisValueStr As String = thisValue.ToString()
                Dim otherValueStr As String = otherValue.ToString()

                'HERE, CHECK THE TWO STRINGS FOR NULL!!!

                Return thisValueStr .CompareTo(otherValueStr )

            End If
        End If
    Catch ex As Exception
        Return 0
    End Try
End Function

如果是这种情况,请仔细检查正在传递的对象中ToString()的实现(假设它是自定义类型)。