编译器警告:null引用异常

时间:2008-11-27 11:58:07

标签: vb.net visual-studio-2005

我在Visual Studio 2005中有以下代码。

    Dim OutFile As System.IO.StreamWriter
    Try
        OutFile = New System.IO.StreamWriter(Filename)
       // Do stuff with OutFile
    Catch Ex As Exception
       // Handle Exception
    Finally
       If OutFile IsNot Nothing Then OutFile.Close()
    End Try

但VS2005会显示“If OutFile IsNot ..”这一行的警告

  

变量'OutFile'在分配值之前使用。在运行时可能会产生空引用异常。

有没有办法通过巧妙地改变代码来删除这个警告,或者只是有更好的方法来做我正在尝试做的事情?

由于

罗布

3 个答案:

答案 0 :(得分:10)

Dim OutFile As System.IO.StreamWriter
OutFile = Nothing
Try
    OutFile = New System.IO.StreamWriter(Filename)
   // Do stuff with OutFile
Catch Ex As Exception
   // Handle Exception
Finally
   If OutFile IsNot Nothing Then OutFile.Close()
End Try

C# error: Use of unassigned local variable

类似

答案 1 :(得分:2)

它是一个范围问题,outfile对象的初始化发生在fianlly块不可见的代码块中。

答案 2 :(得分:1)

当然,接受的答案是正确的,但它没有解释为什么或何时显式初始化可能很重要。

VB.NET 通常在声明变量时指定一个默认值(0Nothing),但是有一些不存在的极端情况。

考虑这个简单的控制台应用程序:

Sub Main()
    For i As Integer = 1 To 5
        Dim number As Integer
        If i = 3 Then number = 3

        Console.Write(number)
    Next
End Sub

输出是什么样的?对于循环的每次迭代,您可能期望number被设置为0,并且它仅在循环的第三次迭代中被设置为3。然后对于第四次和第五次迭代,它再次为0。所以输出是00300,对吧?不是这样。这段代码的输出实际上是

  

00333

那是因为在VB.NET中,循环中声明的变量的生命周期是针对整个循环,而不是循环的一次迭代(不是你期望的那样,是吧?) 。但是,如果您在声明中明确地将number的值设置为0,那么

Dim number As Integer = 0

然后输出看起来像

  

00300

因此,假设VB.NET在Dim变量时设置默认值,通常是安全的,但最明确的是将其明确设置为0或{ {1}}获得预期的行为。