Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net try块内的DataReader导致潜在的空引用错误_Vb.net_Visual Studio_Exception - Fatal编程技术网

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

Vb.net try块内的DataReader导致潜在的空引用错误,vb.net,visual-studio,exception,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 然而VisualStudio仍然警告我 if not IsNothi

可能有一个简单的修复方法,但我目前有类似的代码

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
然而VisualStudio仍然警告我

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 dr As DbDataReader = connection.GetDataReader(sql_str)
    Try
        ' Do something with dr '
    Catch ex As SqlClientException
        log.error(ex)
    End Try
End Using

到底什么是“不起作用”?编译错误(如果是,请发送消息)?或者它在运行时不起作用(抛出异常?如果是,请发送exception.ToString()。我目前的计算机上没有VB.NET编译器:(应用您的建议后,原始海报代码生成的编译时警告仍然存在。