我有一些困难得到一段代码工作。以下是叙述:我有多个具有特定格式的文本文件(因为它们是代码生成的),我需要提取特定的文本块并仅显示文本框中的文本块。例如,一个这样的块将是“STN COMMENT”“END COMMENT”。这个文件可能有两个,三个或甚至10个这样的块,并且将具有不同类型的块,其中评论将被替换为问题,公告或交通。全部以相应的“结束”结束。下面是第一代码段我尝试:StreamReader抛出System.NullReferenceException
'block to parse only this user's announcements
'dl is variable alias for: Environment.NewLine + Environment.NewLine
txtNetLog.Text = "" 'clears the textbox
TmpFileName = logPath + ByCall + "-" + Format(Now, "dd-MMM-yyyy") + ".tmp" 'sets filename with path defined in module
Try
Using sr As StreamReader = New StreamReader(TmpFileName)
Dim line As String = sr.ReadLine()
While Not (line Is Nothing)
line = sr.ReadLine()
If line.Contains("STN ANNOUNCEMENT") Then '***This is line 238 from exception
Do
txtNetLog.Text = txtNetLog.Text & line + dl
line = sr.ReadLine()
Loop Until line.Contains("END ANNOUNCEMENT")
End If
End While
End Using
Catch ex As Exception
Dim msg As String = "Error: Failure Parsing Temp File For Announcements. Contact Developer" + dl + ex.ToString
Dim title = "Error in StreamReader"
Dim errorFile As System.IO.StreamWriter
Dim errorFileName As String = logPath + "Errors.txt"
errorFile = My.Computer.FileSystem.OpenTextFileWriter(errorFileName, True)
errorFile.Write(msg)
errorFile.Close()
MsgBox(msg, MsgBoxStyle.ApplicationModal, title)
End Try
这产生以下情况除外:
System.NullReferenceException:未设置为一个对象的实例对象引用。 在GSPASEC_Net_Control.ReviewNetLogFrm.ParseLog(的Int32数据类型的Int32 SortType)在C:\用户\ KE4NHW \文档\ Visual Studio 2010的\项目\ GSPASEC网络控制\ GSPASEC网络控制\ ReviewNetLogFrm.vb:行238
我有在上面的代码中标出了第238行。然而,这里是块的输出:
STN公告:18点50分54秒KE4NHW
ASDFASDFASDFASDF
STN公告:18点50分57秒KE4NHW
DFADFADFASWERASDF
STN公告:18:51:01 KE4NHW
GHSDETGJNHSDFAW34ASDFG
此输出缺少应放在文本框中的“END ANNOUNCEMENT”行,但否则它会获取所有通知。它错过每个文本块一行(结束行)并抛出nullreferenceexception;除此之外,如果我可以显示结束语句,那么至少我们会得到所有需要拉取的文本。
我自己也尝试没有成功以下变化,都产生了同样的错误:
改变了虽然不是(行没有)......结束在操作循环,直到行没有
改变,这样做直到行没有...循环
我最新的测试版本是这样的:
txtNetLog.Text = ""
'block to parse only this user's Comments
TmpFileName = logPath + ByCall + "-" + Format(Now, "dd-MMM-yyyy") + ".tmp"
Try
Using sr As StreamReader = New StreamReader(TmpFileName)
Dim line As String = sr.ReadLine()
Do Until line Is Nothing
line = sr.ReadLine()
If line.Contains("STN COMMENT") Then
Do Until line.Contains("END COMMENT")
txtNetLog.Text = txtNetLog.Text + line + nl + nl
line = sr.ReadLine()
Loop
End If
Loop
End Using
Catch ex As Exception
Dim msg As String = "Error: Failure Parsing Temp File For Comments. Contact Developer" + nl + nl + ex.ToString
Dim title = "Error in StreamReader"
MsgBox(msg, MsgBoxStyle.ApplicationModal, title)
ErrorLogWriter("ErrorLog.txt", msg)
End Try
同样的事情。不在文本框中输入“END COMMENT”,并引发相同的异常。我不愿意强迫try块阻止异常,但这肯定会导致问题。任何想法在这一个?
您在读取上一行之后,您没有检查'行'是否为空。 – Plutonix
单步执行调试器中的代码将在几分钟内向您显示问题的原因。你应该学会使用它。 –
您还没有检查第一行读取的内容('Dim line ....'),因此该行表示其中一个块的开始,代码将错过它。如果正在读取的文件很小,则可以读取整个文件并逐行处理;如果它们很大,则应该使用StringBuilder作为结果...和调试器的同上 – Plutonix