【问题标题】:DataReader within try block causing potential null reference error尝试块中的 DataReader 导致潜在的空引用错误
【发布时间】:2010-09-14 05:44:10
【问题描述】:

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

的代码
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 块中。

【问题讨论】:

    标签: vb.net visual-studio exception


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      我记不清 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
      

      【讨论】:

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

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

      Dim dr As DbDataReader = Nothing
      

      警告会消失。

      【讨论】:

        【解决方案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
        

        【讨论】:

          猜你喜欢
          • 2012-06-08
          • 2020-12-21
          • 2020-09-08
          • 2010-11-16
          • 1970-01-01
          • 2014-06-08
          • 2021-08-16
          • 1970-01-01
          • 2018-01-03
          相关资源
          最近更新 更多