检查空值时出现空错误

Null Error when checking null value

我正在尝试在使用会话变量执行某些操作之前测试值。 这是为了初始化(如您所见,Session("Chemin") 是一个 String:

列表
        @If (IsDBNull(Session("Chemin")) Or (ViewContext.RouteData.Values("action") = "Index")) Then
        @Code Dim lst As New List(Of String)()
        Session("Chemin") = lst  // Initialisation
     End Code
End If

但是这里的测试有问题:

@If (Not IsDBNull(ViewContext.RouteData.Values("action")) AndAlso Not IsDBNull(Session("Chemin")) AndAlso Not Session("Chemin").Contains((ViewContext.RouteData.Values("action").ToString()))) Then

我有时会

System.NullReferenceException

我不明白,因为我只是在测试它,但它抛出了一个错误。 所以我的问题是:为什么以及何时发生?如何解决这个问题? 编辑:不是重复的,因为不是简单的 System.NullReferenceException

首先: DbNull 与 null 不同(在 VB 俚语中是 Nothing)。因此,如果您这样调用该方法 IsDbNull(),您应该检查该方法是否崩溃:IsDbNull(Nothing)。 我想是的,但我不确定。如果是这样,添加额外的 null 检查就可以了。

如果问题仍然存在,让我们深入研究:

是一个类似于 ViewContext.RouteData.Values("action") 的表达式,链中的所有属性都可以为空。这意味着如果 ViewContextRouteData 甚至 Values 为 null,将抛出此异常。

Session 本身也是如此:它是一种值容器,您检查该容器 中给定键 处的值是否为空。但是,如果 Session 本身为 null 怎么办?这同样适用于 Values 属性。

基本上这会转化为 null.ElementAt("Chemin")。这会在周围的 IsDbNull() 被调用之前崩溃。

所以你可以这样检查:

Session Is Nothing OrElse IsDBNull(Session("Chemin"))
' note: you might want to check if the session contains the key before getting a value with it

Dim values = ViewContext?.RouteData?.Values ' see "Elvis Operator" for the question marks
If (values IsNot Nothing AndAlso values("action") = "Index") Then

您应该将所有 IsDBNull 替换为 IsNothing,这就是您在这种情况下要查找的内容。因为我认为你的

    @If (IsDBNull(Session("Chemin"))

无法通过,因此 Session("Chemin") 可能为 Nothing。

您应该检查 ViewContextViewContext.RouteDataViewContext.RouteData.ValuesViewContext.RouteData.Values("action") 是否为以防万一。

你可以这样做:

                                                @Code Dim values = ViewContext?.RouteData?.Values End Code
                                        @If (values IsNot Nothing) // And the rest of your tests