2012-10-10 67 views
0

好的我是一個完全新手到ASP。控制經典ASP中的空陣列

我有取決於什麼是在陣列通過不同的內容加載客戶端。

select case lcase(arURL(4)) 

雖然有時,arURL(4)可能是空的,在他們的情況下,我發現了以下錯誤:

錯誤運行功能functionName(),錯誤是:

Subscript out of range

有誰知道解決這個問題的方法?

謝謝

確定進一步的代碼按要求。這是可怕的代碼,我不想讓任何人頭痛,所以請原諒。再次感謝........

function GetContent() 
    dim strURL, arURL, strRetval 
    select case lcase(request.ServerVariables("URL")) 
     case "/content.asp" 
      strURL = "" 
      arURL = split(request.querystring("url"), "/") 
      if request("page") = "" then 
       select case lcase(arURL(2)) 
        case "searches" 
         select case lcase(arURL(1)) 
          case "looking" 
           select case lcase(arURL(3)) 
            case "ohai" 
             strRetval = "Lorem" 
            case "blahblah" 
             strRetval = "Lorem Ipsum"       
            case "edinburgh" 
             select case lcase(arURL(4)) 
              case "ohai" 
               strRetval = "Ipsum" 
              case "ohno" 
               strRetval = "Lorem" 
             end select 
            case "bristol" 
             select case lcase(arURL(4)) 
              case "some_blahblah" 
               strRetval = "LOREM" 
              case "overthere" 
               strRetval = "LOREM" 
              case "blahblah" 
               strRetval = "LOREM" 
             end select 
            case "cambridge" 
             select case lcase(arURL(4)) 
              case "some_rubbish" 
               strRetval = "Lorem" 
             end select 
            case else 
             strRetval = " " 
           end select 
          case else 
           strRetval = " " 
         end select 
        case else 
         strRetval = " " 
       end select 
      end if 
    end select 
    strRetval = strRetval & "<style>h2{border: 0px);</style>" 
    GetContent = strRetval 
end function 
+0

首先你需要知道數組的上限,比如ubound(arURL)。當您嘗試訪問不在您的陣列中的索引時顯示此錯誤 – polin

回答

2

您使用經過查詢字符串值,並通過「/」字符拆呢 - 當值不包含「足夠的」斜線,你會得到錯誤的代碼會崩潰。

例如,如果查詢字符串參數url將僅爲「/什麼」,那麼即使arURL(2)也將失敗,因爲該數組只有兩個項目。 (第一個是空字符串,第二個是「東西」)

爲了避免這一切混亂,我可以建議的最好方法是編寫自定義函數,它將數組和索引作爲其參數,並返回給定索引中的項目如果存在,否則爲空字符串:

Function GetItemSafe(myArray, desiredIndex, defValue) 
    If (desiredIndex < LBound(myArray)) Or (desiredIndex > UBound(myArray)) Then 
     If IsObject(defValue) Then 
      Set GetItemSafe = defValue 
     Else 
      GetItemSafe = defValue 
     End If 
    Else 
     If IsObject(myArray(desiredIndex)) Then 
      Set GetItemSafe = myArray(desiredIndex) 
     Else 
      GetItemSafe = myArray(desiredIndex) 
     End If 
    End If 
End Function 

(結束了更寬泛的版本,讓調用代碼決定是什麼的情況下,指數的默認值超出數組範圍)

到這一點,更改您的代碼使用函數而不是直接訪問數組。

這條線,例如:

select case lcase(arURL(2)) 

應該成爲這個代替:

select case lcase(GetItemSafe(arURL, 2, "")) 

改變這些線的其餘因此,您將不再得到錯誤當給定的值不會有效。

+0

什麼是傳奇,就像一個魅力。非常感謝!! – Doyley

+0

沒問題,很久以前就做過了。 :) –

1

的錯誤是在最基本的層面上說的是你要得到一個數組元素不存在的信息,例如arURL可能被聲明爲3個元素,但訪問第4個會生成「下標超出範圍」錯誤。

如果您在數組中的最後一個元素上鍵控,你可能看的UBound函數()函數,它返回高指數數組中的元素,如:

select case lcase(arURL(ubound(arURL)) 

然而,可能在代碼中發生的其他事情會改變你如何確定哪個元素應該被用作「select case」的目標,因此建議發佈更多的代碼。