当我运行VB.NET控制台程序时,我不停地弹出窗口,我只是说“对象引用没有设置为对象的实例”。窗口甚至没有说“错误”或任何东西 - 标题只是项目的名称。但是......我假设这是我不想要的东西。
我搜索了一下,发现了类似消息的帖子,但无法弄清楚它们是如何应用于我的情况的。
以下是我的一些代码。 (该程序应该从预先格式化的文本文件中获取一些数据,该文件描述河流横截面的几何形状,并系统地输入一些新的几何数据来表示以某种方式清理/清除的河床,然后编写以类似格式将新数据发送到新文件。)
Imports System
Imports System.IO
Imports Microsoft.VisualBasic.FileIO
Module module1
Public Sub Main()
Using sr As New StreamReader("C:\inputfile.txt")
Using outfile As New StreamWriter("C:\outputfile.txt")
Dim line As String = ""
Dim styles As Globalization.NumberStyles
styles = Globalization.NumberStyles.AllowLeadingSign Or Globalization.NumberStyles.AllowDecimalPoint
Dim stations(-1) As Double
Dim elevations(-1) As Double
Dim i As Integer = 0
Do
Try
line = sr.ReadLine()
Dim stringarray() As String = line.Split()
ReDim Preserve stations(i)
ReDim Preserve elevations(i)
stations(i) = Double.Parse(stringarray(0), styles)
elevations(i) = Double.Parse(stringarray(1), styles)
Catch ex As Exception
MsgBox(ex.Message)
End Try
i = i + 1
Loop Until line Is Nothing
Dim min As Double = elevations(0)
(some more code.....)
End Using
End Using
End Sub
End Module
我只包含了我的代码的第一部分,因为当我在“Loop Until line Is Nothing”语句中休息时,直到我完成休息后才会出现消息,但是当我放弃休息时在“Dim min As Double = elevations(0)”语句中,消息在程序到达之前出现。
我的代码真的没有问题。有人有什么想法吗?
谢谢!
答案 0 :(得分:0)
在读取最后一行之后代码失败,因为退出条件(Loop Until)不知道您已到达文件末尾。因此,另一个循环启动,代码尝试读取不存在的行。最后一个ReadLine返回Nothing,但代码试图将其拆分。
如果您没有要读取的行,可以在尝试拆分行之前添加一个检查并直接跳转到Loop Until语句。当然我还建议在每个循环中删除数组redim并使用更灵活的List(Of Double)
Dim stations = New List(Of Double)
Dim elevations = New List(Of Double)
Do
Try
' After the last line this command returns null (Nothing in VB)
line = sr.ReadLine()
if line IsNot Nothing Then
Dim stringarray() As String = line.Split()
stations.Add(Double.Parse(stringarray(0), styles))
elevations.Add(Double.Parse(stringarray(1), styles))
End If
Catch ex As Exception
MsgBox(ex.Message)
End Try
Loop Until line Is Nothing
答案 1 :(得分:0)
看看这是否有效:
Public Sub Main()
Dim styles As Globalization.NumberStyles = Globalization.NumberStyles.AllowLeadingSign Or Globalization.NumberStyles.AllowDecimalPoint
Dim stations As New List(Of Double)
Dim elevations As New List(Of Double)
For Each line As String in File.ReadLines("C:\inputfile.txt")
Try
Dim stringarray() As String = line.Split()
stations.Add(Double.Parse(stringarray(0), styles))
elevations.Add(Double.Parse(stringarray(1), styles))
Catch ex As Exception
MsgBox(ex.Message)
End Try
Next Line
Dim min As Double = elevations(0)
Using outfile As New StreamWriter("C:\outputfile.txt")
End Using
End Sub
请注意,我已将输出文件移至最后...您尚未编写任何内容,因此最好等待尽可能长时间打开它,以使其保持打开状态的时间很短可能的。
答案 2 :(得分:0)
好的......我现在觉得自己很愚蠢...在阅读完所有答案并查看Steve的代码之后,我意识到我的代码最后一次通过循环,其中“line”被设置为no循环的开始,它仍然试图添加“无”作为数组的元素。修复它的关键是在向Steve添加元素的语句之前添加一个“If line IsNot Nothing”语句,这是史蒂夫所拥有的。
谢谢大家的答案!