将值设置为不存在的数组项?

时间:2012-10-26 00:08:55

标签: vb.net exception

请查看以下代码:

Try
  Dim Reader As New System.IO.StreamReader(PositionsFileName)
  Do While Reader.Peek() <> -1
    Dim Positions() As String = Reader.ReadLine().Split("|")
    If (Positions(0) Is Nothing) Or (Positions(1) Is Nothing) Or (Positions(2) Is Nothing) Then
      ' something
    End If
  Loop
Catch ex As Exception
  ex.Source = Nothing
End Try

我正在阅读一个文件并希望格式有些东西| something1 | something2。我试图让它设置为“Nothing”到不存在的数组索引(文件格式被破坏),以便If语句顺利进行,但似乎我做错了。你能给我一些提示吗?

3 个答案:

答案 0 :(得分:1)

如果您执行Split("|")并且只有2个项目(例如,something|something1),Positions(2)将不会是Nothing,那么它就不会存在。因此,您的代码会引发异常,即index out of bounds of the array

如果在这种情况下需要Positions(2)包含Nothing,则代码可能如下所示:

Dim Positions(2) As String
Dim tmpArray() As String = Reader.ReadLine().Split("|")
For i = 0 To UBound(Positions)
  If i <= UBound(tmpArray) Then
    Positions(i) = tmpArray(i)
  Else
    Positions(i) = Nothing
  End If
Next

答案 1 :(得分:1)

我假设每个有效行只有三个“Somethings”。如果是这样,请尝试像这样编写Positions()作业:

Dim Positions() As String = Reader _
    .ReadLine() _
    .Split("|") _
    .Concat(Enumerable.Repeat("Nothing", 3)) _
    .Take(3) _
    .ToArray()

这将确保您每次都有三件物品。无需检查是否有事。

答案 2 :(得分:1)

只需在分割后检查positions.length。此外,如果你想检查像“|| Something2 | Something3”这样的情况,第一个位置将是“”而不是Nothing。矿石是一种短路,如果满足早期条件,将保持后者的避免。

If Positions.length < 3 OrElse Positions(0) = "" OrElse Positions(1) = "" OrElse Positions(2) = "" Then
  ' something
End If