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