1

我继承了一个 ASP 项目,我是一个没有 ASP 知识的 PHP 编码器。对不起,如果这篇文章很长,我只想提供尽可能多的信息。

我正在为这一块代码而苦苦挣扎。

Dim resultArray As String()
For Each resultitem In resultArray
    ' Do something with each element of the array
    hash.Add(dllFunctionObj.ReturnTemplateField(i), resultitem)
    i = i + 1
Next

错误:

Exception!!: Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index

解决方案似乎很简单。检查是否resultitem为空,然后中断或跳到下一个元素。

所以我尝试了这个:

If IsNull(resultitem) Then
    Break
End If

错误:

BC30451: Name 'IsNull' is not declared.

我尝试了在网上找到的其他几种替代方法:

  • IsEmpty(resultitem)- IsEmpty 未声明
  • String.IsNullOrEmpty(resultitem)- 索引越界错误,似乎没有效果
  • resultitem Is Nothing- 索引超出范围
  • Not (Len(resultitem) > 0)- 索引超出范围
  • Len(resultitem) = 0- 出界索引

唯一似乎接近的是:

If Not resultitem Then
    Break
End If

错误:

Exception!!: Conversion from string "some_string_here" to type 'Long' is not valid.

如果我使用Next而不是Break我得到这个错误:

If Not resultitem Then
    Next
End If

错误:

BC30081: 'If' must end with a matching 'End If'.

帮助!

我将包含完整的代码块以防万一

Dim isResultArray As Boolean
isResultArray = methodInf.ReturnType.IsArray()
If isResultArray Then
    Dim resultArray As String()
    '*** Invoke the dll function
    resultArray = methodInf.Invoke(REMem, args.ToArray)
    Dim i As Integer = 0
    For Each resultitem In resultArray

        If Not resultitem Then
            Response.Write("Found null value.")
            Exit For
        End If

        Response.Write("i: " & i & "<br />")

        hash.Add(dllFunctionObj.ReturnTemplateField(i), resultitem)
        i = i + 1
        ' i = 6 will cause Get Constituent Name to work
        'If i = 6 Then
        '   Exit For
        'End If
    Next
    outputArray.Add(hash)
Else
    '*** could be boolean, string, long etc.
    Dim result As String
    '*** Invoke the dll function
    result = methodInf.Invoke(REMem, args.ToArray)
    hash.Add(dllFunctionObj.ReturnTemplateField(0), result)
    outputArray.Add(hash)
End If
4

2 回答 2

0

在我看来,数组可能定义不正确。

改变这个:

Dim resultArray As String()
For Each resultitem In resultArray
    ' Do something with each element of the array
    hash.Add(dllFunctionObj.ReturnTemplateField(i), resultitem)
    i = i + 1
Next

对此:

Dim resultArray() As String
For Each resultitem In resultArray()
    ' Do something with each element of the array
    hash.Add(dllFunctionObj.ReturnTemplateField(i), resultitem)
    i = i + 1
Next

此外,您可能需要定义数组的长度,例如:

Dim resultArray(0 to 9) As String

如果数组的长度是未知的,你可以定义它没有最小和最大索引,但ReDim以后需要使用来分配最小和最大索引。一种方法是创建没有长度的数组,计算您知道将添加到数组中的项目,然后ReDim将该计数用作数组的长度。例如:

Dim resultArray() As String
Dim iCount as integer 'Keep track of the count with this variable.

'Enter custom counting script here...Use a loop to count the items that will be used in the array. 

ReDim resultArray(0 to iCount - 1) 'Subtract one from the iCount to match the 0-based index.

如果您尝试调用没有设置长度的数组的索引(或使用大于/小于数组大小的索引),您很可能会遇到“索引超出范围”或“子字符串超出范围”范围”错误。

于 2013-02-15T17:20:13.617 回答
0

您需要确保您没有溢出您正在访问的集合的索引。像这样的东西应该工作:

If i < dllFunctionObj.ReturnTemplateField.Length Then

    hash.Add(dllFunctionObj.ReturnTemplateField(i), resultitem) 

End If

基本上,您需要在此 if 块中包装对“hash.Add”的调用,以防止访问不存在的值。

当然,我不明白代码的目的,所以你可能需要处理“else”的情况。但这应该会停止错误。

于 2013-02-15T17:20:30.757 回答