IOException是新手未处理的错误帮助



你必须原谅我重复的问题,但我似乎无法理解其他人发布的回复。我的编码技能非常有限(vb 2006 和 vs 2010 中只有一年)我知道 sr 打开了太多相同的文件,但我无法找到解决方法。用简单的概念向我解释它会非常有帮助。再次为新手感到抱歉。

项目说明:创建一个保龄球联赛统计守护者。 cmdRegisterBowler将投球手名称添加到dat文件(bowlers.dat)。 cmdEnterScores会将名称和统计信息写入游戏.dat文件。

    Private Sub cmdRegisterBowler_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdRegisterBowler.Click
    'BOWLER REGISTRATION
    Dim Person As String
    Dim Team As String
    txtName.Text.ToUpper()
    txtTeam.Text.ToUpper()
    Person = txtName.Text
    Team = txtTeam.Text
    If Person <> "" And Team <> "" Then
        If IsInFile(Person & " " & Team) = True Then
            MessageBox.Show(Person & " is already in the file.", "Error")
            txtName.Clear()
            txtTeam.Clear()
            txtName.Focus()
        Else
            'swb = stream writer bowlers file
            Dim swb As IO.StreamWriter = IO.File.AppendText("bowlers.dat")
            swb.WriteLine(Person & " " & Team)
            swb.Close()
            MessageBox.Show(Person & " has been added to the file.", "Information Added")
            txtName.Clear()
            txtTeam.Clear()
            txtName.Focus()
        End If
    Else
        MessageBox.Show("You must enter a name.", "Information Incomplete")
    End If

End Sub
Function IsInFile(ByVal person As String) As String
    If IO.File.Exists("bowlers.dat") Then
        Dim sr As IO.StreamReader = IO.File.OpenText("bowlers.dat")
        Dim individual As String
        Do Until sr.EndOfStream
            individual = sr.ReadLine
            If individual = person Then
                Return True
                sr.Close()
            End If
        Loop
        sr.Close()
    End If
    Return False
End Function
Private Sub cmdEnterScores_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdEnterScores.Click
    'SCORE ENTRY
    Dim Person As String
    Dim Team As String
    Dim Score1 As Double
    Dim Score2 As Double
    Dim Score3 As Double
    Dim Average As Double
    Dim Display As String = "{0,-10} {1,10} {2,20} {3,10} {4,10} {5,10} {6,10}"
    Dim Total As Double
    Person = txtName2.Text
    Team = txtTeam2.Text
    Score1 = Val(txtFirstGame.Text)
    Score2 = Val(txtSecondGame.Text)
    Score3 = Val(txtThirdGame.Text)
    Total = Score1 + Score2 + Score3
    Average = Total / 3
    Dim swb As IO.StreamWriter = IO.File.AppendText("bowlers.dat")
    'Checks for blank entries 
    If Person <> "" Then
        'Checks to see if person is registered
        If IsNotInFile(Person) Then
            Dim Response As Integer
            ' Displays a message box with the yes and no options to register bowler.
            Response = MsgBox(Prompt:="The bowler you have entered is currently not registered. Would you like to do so?", Buttons:=vbYesNo)
            'Yes button was selected. Bowler is then registered to bowlers.dat
            If Response = vbYes Then
                ''swb = stream writer bowlers file
                swb.WriteLine(Person & " " & Team)
                swb.Close()
                MessageBox.Show(Person & " has been added to the file.", "Information Added")
                'The no button was selected. Focus is set to bowler registration group box
            Else : Response = vbNo
                txtName2.Clear()
                txtTeam2.Clear()
                txtFirstGame.Clear()
                txtSecondGame.Clear()
                txtThirdGame.Clear()
                txtName.Focus()
            End If
            'If no then clears score entry group box and sets focus back to bowler registr
            txtName.Clear()
            txtName.Focus()
        Else
            'Write scores to games.dat file
            'swg = stream writer games file 
            Dim swg As IO.StreamWriter = IO.File.AppendText("games.dat")
            swg.WriteLine(Name & " " & Team & " " & Score1 & " " & Score2 & " " & Score3)
            swg.Close()
            MessageBox.Show(Person & "'s stats added to the file.", "Information Added")
            txtName.Clear()
            txtName.Focus()
            Dim Display2 As String = "{0,-10} {1,10} {2,20} {3,10} {4,10} {5,10} {6,10}"
            lstDisplay.Items.Add(String.Format(Display2, Person, Team, Score1, Score2, Score3, Total, Average))
        End If
    Else
        MessageBox.Show("You must enter a name.", "Information Incomplete")
    End If

End Sub
Function IsNotInFile(ByVal person As String) As String
    If IO.File.Exists("bowlers.dat") Then
        Dim sr As IO.StreamReader = IO.File.OpenText("bowlers.dat")
        Dim individual As String
        Do Until sr.EndOfStream
            individual = sr.ReadLine
            If individual <> person Then
                Return True
                sr.Close()
            End If
        Loop
        sr.Close()
    End If
    Return False
End Function

这是我的所有代码。提前感谢您的任何帮助。

我已经有一段时间没有使用Visual Basic了,但我相信解决方案很简单。

基本上,您与 System.IO 库的互动目前非常乐观。您应该始终将 IO 交互包装在 TRY...抓住。。。结束尝试块。

在这里查看: MSDN 示例 of StreamReader.ReadLine

为了更清楚地说明我的意思,我在这里更改了您的一个函数:

Function IsInFile(ByVal person As String) As String
    Try
        If IO.File.Exists("bowlers.dat") Then
            Dim sr As IO.StreamReader = IO.File.OpenText("bowlers.dat")
            Dim individual As String
            Do Until sr.EndOfStream
                individual = sr.ReadLine
                If individual = person Then
                    Return True
                    sr.Close()
                End If
            Loop
            sr.Close()
        End If
        Return False
    Catch ie as IOException
        MessageBox.Show("Failed to search for " & person & " in file.", "Error")
        Return false
    End Try
End Function

我会应用类似的逻辑来围绕代码中与文件的所有交互。我还建议不要使用 MessageBox 来报告错误 - 这对于小型项目没关系,但对于任何较大的项目,您将需要使用日志记录框架进行查找。或者在应用程序中构建调试控制台,您可以通过配置选择性地打开或关闭该控制台。