【问题标题】:"Object reference not set to an instance of an object" message“对象引用未设置为对象的实例”消息
【发布时间】:2013-12-03 20:33:16
【问题描述】:

当我运行一个我制作的 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

我只包含了我的代码的第一部分,因为当我在“循环直到行是空的”语句中放置一个中断时,直到我经历了中断之后才出现消息,但是当我放置中断时在“Dim min As Double = elevations(0)”语句中,该消息在程序到达中断之前出现。

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

谢谢!

【问题讨论】:

  • 我看到很多人已经回答过了。我的两分钱,一般来说,Object Reference Not Set to an Instance of an Object 错误指的是不应该是 null 的东西。您基本上需要在第一行放置一个断点,逐步执行,直到您看到抛出的内容,我将成为它的null。从每个人的回答看来,您创建了一个数组并且从未将其调暗到正确的长度。想象一下拿一分钱,试图把它放在一个带盖的罐子里,而你甚至从未指定罐子应该有多大。
  • 要关闭错误,注释掉Try/Catch(错误显然是在其中抛​​出的,因此有消息但没有错误消息)。当代码因错误而停止时,将鼠标光标移到 i(它是 0 还是更高?)并尝试您是否可以看到实际上是哪个变量导致了错误。

标签: vb.net


【解决方案1】:

看看这是否更好:

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】:

    在读取最后一行后代码失败,因为退出条件(循环直到)不知道您已到达文件末尾。因此启动了另一个循环,代码尝试读取不存在的行。最后一个 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
    

    【讨论】:

    • ReDim Preserve stations(0) 创建一个包含一个元素(在索引 0 处)的完全有效的数组。我没有看到错误实际上在哪里......?
    • @KekuSemau 对,我已经好几年没用过那个语句了,可能我已经忘记了它的内部工作原理。但是请检查更新的答案
    【解决方案3】:

    好的...我现在感觉很愚蠢...在阅读了您的所有答案并查看了史蒂夫的代码后,我意识到我的代码最后一次正在循环,其中“行”被设置为空循环的开始,它仍在尝试将“无”作为元素添加到数组中。修复它的关键是在向数组添加元素的语句之前添加一个“If line IsNot Nothing”语句,Steve 有。

    谢谢大家的回答!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多