1

「値が割り当てられる前に変数 'strMap' が使用されています。実行時に null 参照例外が発生する可能性があります」という文字列 strMap のエラーを受け取るという問題があります。

値を適用する前に文字列を使用していると言っていることは理解していますが、コードからわかるように、If ステートメントの最後のセットで値を適用しています (これらは以前は If/Else でしたが、これはそれをいじっていたものでした。

その結果、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

これは、ComboBox の DropDownStyle プロパティを DropDownList に設定することで、常に有効な選択があることを既に確認しているため、最も可能性の高い正しいコードに到達するのにも役立ちます。

   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 に答える