Предупреждение компилятора: исключение нулевой ссылки - PullRequest
6 голосов
/ 27 ноября 2008

У меня есть следующий код в 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 выдает предупреждение для строки «Если OutFile IsNot ..», что

Переменная OutFile используется до того, как ей было присвоено значение. Во время выполнения может возникнуть исключение нулевой ссылки.

Есть ли какой-нибудь способ удалить это предупреждение, слегка изменив код, или это просто лучший способ сделать то, что я пытаюсь сделать?

Спасибо

Rob

Ответы [ 3 ]

10 голосов
/ 27 ноября 2008
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 #: использование неназначенной локальной переменной

2 голосов
/ 27 ноября 2008

Это вопрос области видимости, инициализация объекта outfile происходит в блоке кода, не видимом для блока fianlly.

1 голос
/ 30 июля 2015

Конечно, принятый ответ правильный, но он не объясняет, почему или когда может иметь значение явная инициализация.

VB.NET обычно присваивает значение по умолчанию (0 или Nothing) при объявлении переменной, но в некоторых случаях это не так.

Рассмотрим это простое консольное приложение:

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 или Nothing, чтобы получить ожидаемое поведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...