我正在创建基于图块的游戏。此游戏需要一种方法来加载文本文件并将分隔符“ - ”之间的数字写入多维数组。但是,会出现错误消息“未将对象设置为实例。
'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
我似乎无法确定问题。提前谢谢......
答案 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
!(您的代码甚至不应该编译,您需要解析输入整数,或者您的地图存储字符串,这在逻辑上存储时同样糟糕号。)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>