2014-04-23 2 views
0

변수 details은 값이 할당되기 전에 사용됩니다. details의 문제점은 무엇입니까? 이 초기화되기 전에에만 if에 설정되어 있기 때문에 변수 'details'는 값이 지정되기 전에 사용됩니다.

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

조건이 거짓으로 평가되면

에서, 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 

답변

1

문제는이 부분에서 btnRemove_Click 방법에 지금까지 차단하십시오.

는 당신이 문제를 해결하기 위해 if 블록에 다음 줄을 이동한다고 가정 :

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

또한, 당신이 어떤 경우에 설정 그래서 details에 대한 기본 값이 올 수 있습니다. 성능상의 이유로, 당신은 else 지점의 기본 값 (예를 들어, 텍스트 또는 String.Empty)을 설정할 수 있습니다

Dim details As String 
If lblTaskName.Items.Count > 0 Then 
    ' ... 
Else 
    details = "Default Value" 
End If 
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 변수를 선언합니다. 그런 다음 lblTaskName 컨트롤에 1 개 이상의 항목이 있는지 확인합니다. 테스트에 통과하면 첫 번째 항목을 details에 할당합니다. 하지만 테스트가 통과하지 못하면 어떻게 될까요? lblTaskName 컨트롤에 0 개의 항목이 있으면 어떻게 되나요? 이 경우 If 블록의 내부는 실행되지 않으며 details에 저장된 내용은 없습니다. 그런 다음 마지막 줄에서 If 블록 외부의 details 변수 *의 값을 사용하려고합니다. 이것은 값이 할당되지 않았기 때문에 불법입니다. 그 WriteAllText 라인 If 블록의 내부 을 할 수 있도록

아마도 당신은 의미? 그렇지 않은 경우 lblTaskName에 0 개의 항목이있는 경우를 처리하기 위해 If 문에 Else 절을 추가해야합니다. 그에서 제외


는 문체는 가능하면 선언시 변수를 초기화하는 것을 선호한다, 말하기. 그래서 예를 들어, 쓰는 대신 :

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) 

(.. 나는 OCD, 그래서 내가이 표시를 동일 그 부분은 완전히 선택 사항입니다 줄)

코드 실행 속도가 빨라지지는 않지만 읽는 것이 더 쉬워집니다! 더 중요한 것은 버그 가능성을 줄입니다.

관련 문제