1

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

我知道这是说我在应用值之前使用字符串,但是,正如您从代码中看到的那样,我在最后一组 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

4 回答 4

3

它正在谈论这个:

Dim strMap As String

将其更改为:

Dim strMap As String = ""

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

于 2013-10-20T15:46:21.693 回答
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
于 2013-10-20T15:57:12.557 回答
1

如果您对 cmbMapSimple 组合的所有测试均失败,则您的 strMap 未初始化,编译器会正确警告您。

您可以避免在声明变量时为变量显式分配值的问题

Dim strMap As String = String.Empty

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

于 2013-10-20T15:48:08.050 回答
1

strMap 可能未设置为任何值。最好的解决方案是将所有这些 If Else 语句更改为 Select Case 语句,然后使用 Case Else 将 strMap 设置为“未知”

于 2013-10-20T15:48:08.200 回答