try块内的DataReader导致潜在的空引用错误

时间:2008-09-30 11:43:16

标签: vb.net visual-studio exception

可能有一个简单的解决方法,但我目前的代码类似于

dim dr as dbDataReader

try
      dr = connection.getDataReader(sql_str)
Catch ex as sqlClientException
     log.error(ex)
finally 

  if not IsNothing(dr) then
    dr.close
  end if
end try

然而,Visual Studio仍然警告我

if not IsNothing(dr) then
        dr.close
      end if

可能导致NullReferenceException。减轻这种情况的最佳方法是什么?我无法将声明移到try块中。

4 个答案:

答案 0 :(得分:9)

将dr声明显式初始化为Nothing:

Dim dr As DbDataReader = Nothing

警告将消失。

答案 1 :(得分:4)

如果GetDataReader抛出,dr将不会被分配,并且仍会保留其初始值。 VB.NET会初始化对Nothing的引用,但编译器不会让你依赖它。

如果使用.NET 2.0,我建议使用Using语句:

Using dr As DbDataReader = connection.GetDataReader(sql_str)
    Try
        ' Do something with dr '
    Catch ex As SqlClientException
        log.error(ex)
    End Try
End Using

答案 2 :(得分:0)

您的代码是正确的。在finally语句中,只要您检查以确保对象不为null,它就不会根据代码中的内容抛出空引用异常。

答案 3 :(得分:0)

我不记得究竟,VB.NET是如何初始化变量的,但是在C#中你必须先设置“dr”一些值/引用,然后才能在某处使用它们。

我认为这应该有效:

dim dr as dbDataReader

try
      dr = connection.getDataReader(sql_str)
Catch ex as sqlClientException
     log.error(ex)
     dr = Nothing ' there is the change '
' finaly block is not necesary '
end try

if not IsNothing(dr) then
  dr.close
end if