检查空值时出现空错误
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")
的表达式,链中的所有属性都可以为空。这意味着如果 ViewContext
、RouteData
甚至 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。
您应该检查 ViewContext
、ViewContext.RouteData
、ViewContext.RouteData.Values
和 ViewContext.RouteData.Values("action")
是否为以防万一。
你可以这样做:
@Code Dim values = ViewContext?.RouteData?.Values End Code
@If (values IsNot Nothing) // And the rest of your tests
我正在尝试在使用会话变量执行某些操作之前测试值。 这是为了初始化(如您所见,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")
的表达式,链中的所有属性都可以为空。这意味着如果 ViewContext
、RouteData
甚至 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。
您应该检查 ViewContext
、ViewContext.RouteData
、ViewContext.RouteData.Values
和 ViewContext.RouteData.Values("action")
是否为以防万一。
你可以这样做:
@Code Dim values = ViewContext?.RouteData?.Values End Code
@If (values IsNot Nothing) // And the rest of your tests