Compiler warning: null reference exception

2019-02-17 07:08发布

I have the following code in 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

But VS2005 brings up the warning for the line "If OutFile IsNot.." that

Variable 'OutFile' is used before it has been assigned a value. A null reference exception could result at runtime.

Is there some way of removing this warning by subtly altering the code or is there just a better way of doing what I'm trying to do?

Thanks

Rob

3条回答
smile是对你的礼貌
2楼-- · 2019-02-17 07:34
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

Similar to C# error: Use of unassigned local variable

查看更多
We Are One
3楼-- · 2019-02-17 07:36

Its a question of scope, the initialisation of the outfile object is happening in a block of code not visible to the fianlly block.

查看更多
做自己的国王
4楼-- · 2019-02-17 07:39

The accepted answer is correct, of course, but it doesn't explain why or when explicit initialization may matter.

VB.NET usually assigns a default value (0 or Nothing) when a variable is declared, but there are corner cases where it doesn't.

Consider this simple console application:

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

What's the output look like? You might expect that number gets set to 0 for every iteration of the loop, and it only gets set to 3 on the third iteration of the loop. Then for the fourth and fifth iteration, it'd be 0 again. So the output is 00300, right? Not so. The output of this code is actually

00333

That's because in VB.NET, the lifetime of a variable declared in a loop is for the whole loop, not for one iteration of the loop (Not what you'd expect, huh?). But if you explicitly set the value of number to 0 at its declaration, like so

Dim number As Integer = 0

then the output looks like

00300

So it's usually safe to assume VB.NET will set the default value when you Dim a variable, but it's always safest to set it explicitly to 0 or Nothing to get the expected behavior.

查看更多
登录 后发表回答