2011-09-28 45 views
1

我正在創建基於磁貼的遊戲。這個遊戲需要一個方法來加載一個文本文件,並將分隔符「 - 」之間的數字寫入一個多維數組。發生然而,錯誤消息「對象未設置爲一個實例將字符串讀入數組時出錯

'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 

我似乎無法確定問題謝謝..。 。

回答

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 

獎勵:檢查是否存在錯誤:如果地圖不具有預設的寬度/高度?爲什麼要硬編碼呢?

1

如果溫度爲空(Nothing)在VB.Net,那麼你就不能調用它的方法。

做一次檢查的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 

而你STILL得到空引用exeption?

+0

相同的錯誤消息...「對象引用未設置爲對象的實例。」 – Hmm

+0

你的評論似乎表明它是源自這一行'tempLine = temp.Split(「 - 」)'這是堆棧跟蹤指示的內容,還是顯示給你不同的行? – Josh

+0

是的,它表明那條線。 – Hmm

0

還確保您的StreamReader已正確初始化...如果初始化失敗(可能是因爲錯誤的URI),那麼嘗試調用osRead.peek()將拋出「未設置爲實例的對象」錯誤。

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 

您的其他循環也是如此。