我有一些代码(另一个开发人员写的)我需要修改,因为ExecuteProc过程失败了。 (它失败的原因不在这个问题的范围内。这是一个很长的故事),但范围是我不确定为什么NullReferenceException
会发生。它是在VB.NET中(我自己不是VB.NET的人,所以我不确定这是否是VB.NET特有的):
Imports System.Data
Imports System.Data.SqlClient
Imports System.Data.SqlTypes
Imports System.Collections
'(...)
Public Overloads Function ExecuteProc( ByVal pvsProcName as String) As DataSet
Dim oCommand As SqlCommand
Dim oDataAdaptor As SqlDataAdapter = New SqlDataAdapter
'Other Stuff here
Try
oCommand = CommandGet(ConnectionGet)
'Do some more stuff that's irrelevant
Catch oException As Exception
Throw oException
Finally
ConnectionClose(oCommand.Connection)
oCommand.Dispose()
oDataAdaptor.Dispose()
End Try
End Function
我收到以下警告:
Variable 'oCommand' is used before it has been assigned a value. A null reference exception could result at runtime.`
修改:我在发布问题之前就找到了答案。我发布了它以保持它周围(我讨厌把十分钟的东西扔进去,不知不觉)。
我对VB.NET人员的后续问题是:
以下两个初始化有什么不同:
Dim oCommand As SqlCommand = Nothing
和
Dim oCommand as New SqlComand
答案 0 :(得分:7)
嗯,最显而易见的是,如果CommandGet
失败并抛出异常,oCommand
将不会被设置 - 它仍然是null,所以最后oCommand.Connection
block将抛出NullReferenceException
。
另外,我会说:
Catch
阻止Using
块(一个用于命令,一个用于适配器)将比明确的Try
/ Finally
块更好IMO 我会使用第三种解决方案 - 使用块:
Using oCommand As CommandGet(ConnectionGet)
' All the normal stuff in here '
End Using
答案 1 :(得分:3)
这只是意味着VB.NET编译器无法判断变量在使用之前是否已初始化,因为您的异常或块的结构是这样的。
您可以通过显式初始化变量来避免警告:
Dim oCommand As SqlCommand = Nothing