错误将字符串读入数组

时间:2011-09-28 13:17:20

标签: vb.net

我正在创建基于图块的游戏。此游戏需要一种方法来加载文本文件并将分隔符“ - ”之间的数字写入多维数组。但是,会出现错误消息“未将对象设置为实例。

'Load map
Public Sub LoadMap(ByVal URI As String)

    Using reader As New System.IO.StreamReader(URI)

        For x As Integer = 0 To 13

            Dim line = reader.ReadLine()

            Dim tokens() As String = line.Split("-")

            'adds values to multidimensional array
            For y As Integer = 0 To 16
                Me.map(x, y) = Integer.Parse(tokens(y))
            Next y
        Next x
    End Using
End Sub

示例地图 - 数字代表图像ID

 2-2-2-0-0-0-0-0-0-0-0-3-3-5-5-5-5
2-2-2-0-0-0-0-0-0-0-0-3-3-5-5-5-5
2-2-2-0-0-0-0-0-0-0-0-3-3-2-2-2-5
2-2-2-0-0-0-0-0-0-0-0-3-3-2-2-2-5
2-2-2-0-0-0-0-0-0-0-0-3-3-2-2-2-5
0-0-0-0-0-0-0-0-0-0-0-3-3-2-2-2-5
3-3-3-3-3-3-3-3-3-3-3-3-3-3-3-3-3
4-4-4-4-4-3-4-4-4-4-4-4-4-2-2-2-2
4-4-4-4-4-3-4-4-4-4-4-4-4-2-2-2-2
4-4-4-4-4-3-4-4-4-4-4-4-4-2-2-2-2
4-4-4-4-4-3-4-4-4-4-4-4-4-2-2-2-2
4-4-4-4-4-3-4-4-4-4-4-4-4-2-2-2-2
4-4-4-4-4-3-4-4-4-4-4-4-4-2-2-2-2
4-4-4-4-4-3-4-4-4-4-4-4-4-2-2-2-2

我似乎无法确定问题。提前谢谢......

4 个答案:

答案 0 :(得分:2)

如果到达输入流的末尾,

osRead.ReadLine()将返回Nothing。你打电话给Peek,看看你是否在输入结束时,然后,你继续阅读12行,而不检查你是否在中间输入的末尾。如果您的行数少于12行,则会在temp.Split("-")上收到您提到的错误,因为temp的值为Nothing,因此您无法调用其中的方法

另外,只是注意到了一些事情......你的地图是11x8,但是你正在阅读12行,并且你想要做9个值:

For x As Integer = 0 To 10

For x As Integer = 1 To 11

你的另一个循环也一样。

答案 1 :(得分:2)

  • 始终使用Option Strict On(您的代码甚至不应该编译,您需要解析输入整数,或者您的地图存储字符串,这在逻辑上存储时同样糟糕号。)
  • 正确命名变量。
  • 忽略空洞的评论。只评论代码中不明显的内容。
  • 不要硬编码魔法数字(什么是11?8?)
  • 在初始化之前不要声明变量。首次使用时声明。
  • 代码中的外部循环毫无意义。
  • 不要手动关闭流,请始终使用Using块以确保程序在异常情况下仍能正常工作。
  • 初始化map

让我们留下:

Public Sub LoadMap(ByVal URI As String)
    Const MapHeight As Integer = 12
    Const MapWidth As Integer = 9

    Me.map = New Integer(MapHeight, MapWidth) { }

    Using reader As New System.IO.StreamReader(URI)
        For x As Integer = 0 To MapHeight - 1
            Dim line = reader.ReadLine()
            Dim tokens() As String = line.Split("-")

            For y As Integer = 0 To MapWidth - 1
                Me.map(x, y) = Integer.Parse(tokens(y))
            Next y
        Next x
    End Using
End Sub

奖励:检查错误:如果地图没有预定义的宽度/高度怎么办?为什么要对此进行硬编码?

答案 2 :(得分:1)

如果VB.Net中的temp为null(Nothing),则无法在其上调用方法。

在尝试对值进行任何操作之前,请检查Nothing


所以只是为了确保你已经更新了你的代码,看起来像这样:

If temp IsNot Nothing
    'tempLine stores the split read line
    Dim tempLine() As String

    'splits readline into - ERROR Not set to an instance
    tempLine = temp.Split("-")

    'adds values to multidimensional array
    For y As Integer = 0 To 8
    Me.map(x, y) = tempLine(y)
    Next y
End If

你是仍然获得空参考exeption?

答案 3 :(得分:0)

还要确保您的StreamReader已正确初始化...如果初始化失败(可能是因为URI错误),那么尝试调用osRead.peek()会抛出“未设置为实例的对象”错误。 / p>