“在赋值之前使用变量'strMap'。在运行时可能会产生空引用异常”

时间:2013-10-20 15:43:08

标签: vb.net string if-statement vb.net-2010

我遇到一个问题,我收到一个“变量'strMap'在被分配一个值之前使用。一个空引用异常可能导致运行时”字符串strMap错误。

据我所知,我正在使用字符串BEFORE我正在应用一个值,但是,正如您从代码中看到的那样,我在最后一组If语句中应用了一个值(这些是之前的If / Else但我认为这就是搞乱它的原因。

因此,它找不到shell命令中指定的文件,因为strMap字符串表示为空。

提前致谢。

戴蒙

Private Sub btnCreateServerSimple_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCreateServerSimple.Click

    'Working code for server creation using pre-existing batch files

    'Declarations
    Dim strGameType As String
    Dim strMap As String
    Dim strServer As String
    'Dim strBatchFile As String
    Dim strBatchLoc As String

    'Checking for selected server and setting strServer string accordingly
    If cmbServerSimple.Text = "Server 1" Then
        strServer = "server1"
        strBatchLoc = frmInstallUpdateSettings.txtCSGOServer1BatchFilesLocation.Text
    Else : cmbServerSimple.Text = "Server 2"
        strServer = "server2"
        strBatchLoc = frmInstallUpdateSettings.txtCSGOServer2BatchFilesLocation.Text
    End If

    'Checking for gametype and setting strGameType string accordingly
    If cmbGameTypeSimple.Text = "Classic Competative" Then
        strGameType = "classic_competative"
    Else : cmbGameTypeSimple.Text = "Classic Casual"
        strGameType = "classic_casual"
    End If

    'Checking for selected map and setting strMap string accordingly
    If cmbMapSimple.Text = "de_aztec" Then
        strMap = "de_aztec"
    End If
    If cmbMapSimple.Text = "de_dust2_se" Then
        strMap = "de_dust2_se"
    End If
    If cmbMapSimple.Text = "de_dust" Then
        strMap = "de_dust"
    End If
    If cmbMapSimple.Text = "de_inferno" Then
        strMap = "de_inferno"
    End If
    If cmbMapSimple.Text = "de_nuke_ve" Then
        strMap = "de_nuke_ve"
    End If
    If cmbMapSimple.Text = "de_mirage" Then
        strMap = "de_mirage"
    End If
    If cmbMapSimple.Text = "de_train" Then
        strMap = "de_train"
    End If
    If cmbMapSimple.Text = "de_vertigo" Then
        strMap = "de_vertigo"
    End If


    Shell("C:\Users\Damon\Desktop\batchtest\" & strServer & "_" & strGameType & "_" & strMap & ".bat", AppWinStyle.NormalFocus)

End Sub

4 个答案:

答案 0 :(得分:3)

正在谈论这个:

Dim strMap As String

将其更改为:

Dim strMap As String = ""

你是正确的,它是在使用之前设置的,但警告告诉你 IF 你试图在它设置之前在块中使用它,它可能会导致异常。其他字符串也应该设置。

答案 1 :(得分:2)

警告是准确的,如果没有任何If()语句匹配,那么你最终将取消分配strMap。编写更好的代码,使用If / ElseIf / Else。 Select语句应该是您的偏好:

    Select Case cmbMapSimple.Text
        Case "de_aztec"    : strMap = "de_aztec"
        Case "de_dust2_se" : strMap = "de_dust2_se"
        Case "de_dust"     : strMap = "de_dust"
        '' etc...
        Case Else : Throw New Exception("Invalid map selection")
    End Select

这也可以帮助您获得最可能的正确代码,因为您已经通过将其DropDownStyle属性设置为DropDownList来确保ComboBox始终具有有效选择:

   If cmbMapSimple.SelectedIndex < 0 Then 
       Throw New Exception("Invalid map selection")
   End If
   strMap = cmbMapSimple.Text

答案 2 :(得分:1)

如果你对cmbMapSimple组合的所有测试都失败了,那么你的strMap就不会被初始化,并且编译器会正确警告你。

您可以避免在声明变量时明确为变量赋值的问题

Dim strMap As String = String.Empty

然后,当然,如果变量为空,您决定做什么取决于您的代码。

答案 3 :(得分:1)

strMap可能没有设置为任何东西。 最好的解决方案是将所有If Else语句更改为Select Case语句,然后使用Case Else将strMap设置为“unknown”