Revision #3

You are currently reviewing an older revision of this page.
Go to current version


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

The error message couldn't do a better job in conveying what went wrong. Lets back up...

An index is an integer that identifies the location of an element in a array, list, or other collection type. When accessing items in an array, list or other collection type, you use parenthesis with an index number inside. Array(Index# or Integer Variable).

What is the range?

A range is comprised of two parts:
  • Inclusive Lower Bound
    • The Lower Bound is the lowest available index number in the collection, and should always be zero.
      • There will not be a zero index in the collection if there are no items in the collection.
  • Inclusive Upper Bound
    • The Upper Bound is the highest available index number in the collection.
  • What do you mean by Inclusive?
    • This means that this number is included in the range.
      • Example:
      • Lets say your lowerbound is zero(it always is)
      • Lets say your upperbound is 10
      • This means there would be 11 Items total located at the following indexes:
      • 0,1,2,3,4,5,6,7,8,9,10

Why does the 'Index was out of range.' error occur?

Remember, this error message does an excellent job of conveying what went wrong and what to avoid! It tells you:

  • The index must be non-negative, which means the lowest possible index number that can exist is zero.
  • The index number that you are using must be smaller than the size of the collection. 
    • Example
    • If the collection contains a total of 6 elements, since the first index in the collection will be zero, instead of 1, this means that you will never have an index of six(otherwise there would be 7 elements in the collection). Therefore the UpperBound of the collection is calculated like this                           UpperBound = Collection.Items.Count - 1, or UpperBound = UBound(Array)
  • That's it, just make sure that you are calculating your indexes correctly.

How to avoid this error:

  • Always check what the UpperBound(highest available index) of that particular collection is.
  • Only attempt to access that index once you have confirmed that it exists
    • Example
    • Option Strict On
      Public Class Form1
          Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
              Dim MyArray As Integer() = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
              Dim Tmp As Integer
              For I = 0 To UBound(MyArray)
                  'This will not go outside of the bounds of the array
                  'no error will be caught here
                  Try
                      Tmp = MyArray(I)
                  Catch ex As Exception
                      MsgBox(ex.Message)
                  End Try
              Next
              For I = 0 To MyArray.Count - 1
                  'This will not go outside of the bounds of the array
                  'no error will be caught here
                  Try
                      Tmp = MyArray(I)
                  Catch ex As Exception
                      MsgBox(ex.Message)
                  End Try
              Next
              For I = 0 To 9
                  'This will not go outside of the bounds of the array
                  'no error will be caught here
                  Try
                      Tmp = MyArray(I)
                  Catch ex As Exception
                      MsgBox(ex.Message)
                  End Try
              Next
              For I = 0 To MyArray.Count - 1
                  'This will not go outside of the bounds of the array
                  'no error will be caught here
                  Try
                      Tmp = MyArray(I)
                  Catch ex As Exception
                      MsgBox(ex.Message)
                  End Try
              Next
              For I = 0 To MyArray.Count
                  'This will go outside of the bounds of the array
                  'and an error will be caught
                  Try
                      Tmp = MyArray(I)
                  Catch ex As Exception
                      MsgBox(ex.Message)
                  End Try
              Next
              For I = 0 To 10
                  'This will go outside of the bounds of the array
                  'and an error will be caught
                  Try
                      Tmp = MyArray(I)
                  Catch ex As Exception
                      MsgBox(ex.Message)
                  End Try
              Next
          End Sub
      End Class

References

I hope you find this helpful, and if I have missed something, please update the article!

Revert to this revision