0

变量details在被赋值之前被使用。有什么问题details

Option Explicit On
Imports System.Text
Imports System.IO
Public Class Main
    Private SelectedItem As ListViewItem
    Dim data As String

    Dim strpriority As String
    Dim task As String
    Dim createdate As String
    Dim duedate As String

    Private Sub btnAdd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAdd.Click
        AddTask.Show()
        Me.Hide()
    End Sub

    Private Sub HistoryToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles HistoryToolStripMenuItem.Click
        History.Show()
        Me.Hide()

    End Sub

    Private Sub Main_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim fpath As String
        Dim splitdata
        fpath = AppDomain.CurrentDomain.BaseDirectory
        Dim filepath As String
        filepath = fpath & "task.txt"
        Dim details As String
        details = My.Computer.FileSystem.ReadAllText(filepath)
        splitdata = Split(details, vbCrLf)
        Dim i As Integer
        For i = 0 To UBound(splitdata)
            lblTaskName.Items.Add(splitdata(i))
        Next

        lblTime.Enabled = True
        Timer1.Interval = 10
        Timer1.Enabled = True
        lblDate.Text = DateTime.Now.ToString("dd MMMM yyyy")
    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        lblTime.Text = TimeOfDay
    End Sub

    Private Sub btnExit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExit.Click
        End
    End Sub

    Private Sub btnRemove_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRemove.Click
        If lblTaskName.SelectedItem = "" Then
            MsgBox("Please select a record")

        Else

            If lblTaskName.Items.Count > 0 Then
                If MessageBox.Show("Do you really want to delete this record?", "Delete", MessageBoxButtons.YesNo) = MsgBoxResult.Yes Then
                    lblTaskName.Items.Remove(lblTaskName.SelectedItem.ToString())

                Else
                    MessageBox.Show("Operation Cancelled")

                End If
            End If

        End If

        Try

            Dim fpath As String
            fpath = AppDomain.CurrentDomain.BaseDirectory
            Dim filepath As String
            filepath = fpath & "task.txt"
            Dim details As String
            If lblTaskName.Items.Count > 0 Then
                details = lblTaskName.Items(0)
                Dim i As Integer
                For i = 1 To lblTaskName.Items.Count - 1

                    details = details & vbCrLf & lblTaskName.Items(i)

                Next
            End If
            My.Computer.FileSystem.WriteAllText(filepath, details, False)
        Catch ex As Exception
            MsgBox("Values Can't be inserted this time")
        End Try
    End Sub

    Private Function filepaths() As String
        Throw New NotImplementedException
    End Function
End Class
4

2 回答 2

1

问题出btnRemove_Click在这部分的方法中:

Dim details As String
If lblTaskName.Items.Count > 0 Then
    details = lblTaskName.Items(0)

如果条件评估为假,则details在初始化之前使用该变量,因为到目前为止它仅在if块中设置。

我想您想将以下行移动到if块中以解决问题:

My.Computer.FileSystem.WriteAllText(filepath, details, False)

或者,您可以提出一个默认值,details以便在任何情况下都可以设置它。出于性能原因,您可以在分支中设置默认值(例如 text 或String.Empty) :else

Dim details As String
If lblTaskName.Items.Count > 0 Then
     ' ...
Else
    details = "Default Value"
End If
于 2014-04-23T18:19:22.810 回答
1

您需要仔细考虑程序的流程。考虑这段代码:

Dim details As String
If lblTaskName.Items.Count > 0 Then
    details = lblTaskName.Items(0)
    Dim i As Integer
    For i = 1 To lblTaskName.Items.Count - 1
        details = details & vbCrLf & lblTaskName.Items(i)
    Next
End If
My.Computer.FileSystem.WriteAllText(filepath, details, False)

details在顶部声明变量。然后检查控件中是否至少有 1 个项目lblTaskName。如果该测试通过,那么您将第一项分配给details. 但是,如果该测试没有通过怎么办?如果lblTaskName控件中有 0 个项目怎么办?在这种情况下,If块的内部永远不会运行,也不会存储任何内容details。然后在最后一行,您尝试在块外使用details变量 *outside 的值。If这是非法的,因为它可能没有被赋值。

也许您的意思是让那条WriteAllText线块内If?否则,您需要在语句中添加一个Else子句来If处理lblTaskName.


除此之外,从风格上讲,您应该尽可能在声明时初始化变量。因此,例如,而不是写:

    Dim fpath As String
    Dim splitdata
    fpath = AppDomain.CurrentDomain.BaseDirectory
    Dim filepath As String
    filepath = fpath & "task.txt"
    Dim details As String
    details = My.Computer.FileSystem.ReadAllText(filepath)
    splitdata = Split(details, vbCrLf)

写成:

    Dim fpath As String       = AppDomain.CurrentDomain.BaseDirectory
    Dim filepath As String    = fpath & "task.txt"
    Dim details As String     = My.Computer.FileSystem.ReadAllText(filepath)
    Dim splitdata() As String = Split(details, vbCrLf)

(我是强迫症,所以我把我的等号排成一行。那部分是完全可选的。)

它不会使代码运行得更快,但它确实使它更容易阅读!更重要的是,它减少了出现错误的可能性。

于 2014-04-23T18:20:19.127 回答