“对象引用未设置为对象的实例”消息

时间:2013-12-03 20:33:17

标签: vb.net

当我运行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)”语句中,消息在程序到达之前出现。

我的代码真的没有问题。有人有什么想法吗?

谢谢!

3 个答案:

答案 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”语句,这是史蒂夫所拥有的。

谢谢大家的答案!