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

时间:2020-03-06 14:55:05  来源:igfitidea点击:

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

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块中。

解决方案

代码是正确的。在" finally"语句中,只要我们检查以确保对象不为null,就不会根据代码中发生的情况抛出null引用异常。

我不完全记得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

像这样将Dr声明显式初始化为Nothing:

Dim dr As DbDataReader = Nothing

并且警告将消失。

如果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