2010-12-22 3 views
1

Ich fand einige Code im Internet wie folgt (leicht modifiziert).verhindern Warnungen auf Variablen, die keinen Wert in einem Try zugewiesen sind

Es fordert einfach den Inhalt einer Webseite an.

Private Sub readWebpage(ByVal url As String) 
    Dim Str As System.IO.Stream 
    Dim srRead As System.IO.StreamReader 
    Try 
     ' make a Web request 
     Dim req As System.Net.WebRequest = System.Net.WebRequest.Create(url) 
     Dim resp As System.Net.WebResponse = req.GetResponse 
     Str = resp.GetResponseStream 
     srRead = New System.IO.StreamReader(Str) 
     ' read all the text 
     textContent.text = srRead.ReadToEnd 
    Catch ex As Exception 
     MsgBox(ex.Message, MsgBoxStyle.Critical, "Unable to download content from: " & url) 
    Finally 
     srRead.Close() 
     Str.Close() 
    End Try 
End Sub 

Allerdings erhalte ich zwei Warnungen:

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


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

Ich weiß, ich kann einfach über die Finally vergessen und den Code try-Block hinzuzufügen.

Soll das der richtige Weg sein oder kann ich die Warnungen mit einem anderen Ansatz verhindern?

Vielen Dank im Voraus für die Erleuchtung mich! :)

Antwort

3

Die Warnung ist, da, wenn es einen Fehler auf GetResponseStream gibt, Ihr srRead Null sein wird, resultierend in einer Nullausnahme.

Eine Möglichkeit, dies zu umgehen ist die Verwendung der automatisch dieser Objekte verfügen wird

Private Sub readWebpage(ByVal url As String) 
     Try 
      ' make a Web request 
      Dim req As System.Net.WebRequest = System.Net.WebRequest.Create(url) 
      Dim resp As System.Net.WebResponse = req.GetResponse 
      Using Str As System.IO.Stream = resp.GetResponseStream 
       Using srRead As System.IO.StreamReader = New System.IO.StreamReader(Str) 
        textContent = srRead.ReadToEnd 
       End Using 
      End Using 


    Catch ex As Exception 
     MsgBox(ex.Message, MsgBoxStyle.Critical, "Unable to download content from: " & url) 

    End Try 
    End Sub 

Sie auch die Möglichkeit, Dr. Evil schlägt Einstellung das Objekt auf Nothing anstelle der Verwendung von Keyword gehen könnte dann werden Sie wollen dies in Ihrem schließlich

Finally 
     If Str Is Not Nothing Then 
      Str.Close 
     End If 
     If srRead Is Not Nothing Then 
      srRead.Close 
     End If 
End Try 
+0

Ich muss die Verbindung nicht schließen, wenn ich 'Using' verwende? – PeeHaa

+0

Nein, die Using-Anweisung macht es für Sie. (Schließen ist das gleiche wie Dispose) –

+0

Großartig. Ich denke, das ist der beste Ansatz. Danke für alle Infos! – PeeHaa

10

Sie können einfach eingestellt ihnen nichts standardmäßig auf diese Weise Sie den Compiler informieren wissen Sie, was Sie tun :)

Dim Str As System.IO.Stream = Nothing 
+0

Danke für diesen Ansatz! – PeeHaa

+0

Dies ist die Methode, die ich benutze, aber ich hasse das in vb.net kann ich nicht die folgenden tun: Dim a, b, c, d als double = Nichts 'Ich habe folgendes zu tun: Dim a als Double = Nothing'' Dim b als Double = Nichts ... 'Es sind viel mehr Codezeilen, um die Warnungen zu schließen. –

+0

Das scheint lächerlich. Ich hasse VB.NET. Sie würden denken, dass "Dim Str As System.IO.Stream" gleichwertig wäre. – crush