ArgumentOutOfRange Exception

Hi guys, I bought the book Unity Game Development by Example Beginner’s Guide.
And in chapter 5, Making a robot repair game, i keep getting this error

ArgumentOutOfRangeException: Index is less than 0 or more than or equal to the list count.
The error is from 12th line inside Start() Function just below the Random.Range code

I dont know how to solve this issue, Please help…

Here is the code…

var cols:int = 4; // the number of columns in the card grid
var rows:int = 4; // the number of rows in the card grid
var totalCards:int = cols*rows; // I think the answer is 16, but I was never good with numbers.
var matchesNeededToWin:int = totalCards * 0.5; // If there are 16 cards, the player needs to find 8 matches to clear the board
var matchesMade:int = 0; // At the outset, the player has not made any matches
var cardW:int = 100; // Each card's width and height is 100 pixels
var cardH:int = 100;
var aCards:Array; // We'll store all the cards we create in this Array
var aGrid:Array; // This array will keep track of the shuffled, dealt cards
var aCardsFlipped:ArrayList; // This array will store the two cards that the player flips over
var playerCanClick:boolean; // We'll use this flag to prevent the player from clicking buttons when we don't want him to
var playerHasWon:boolean = false; // Store whether or not the player has won. This should probably start out false :)

function Start()
{
	playerCanClick = true; // We should let the player play,	don't you think?
	// Initialize the arrays as empty lists:
	aCards = new Array();
	aGrid = new Array();
	aCardsFlipped = new ArrayList();
	for(var i=0; i<rows; i++)
	{
		aGrid *= new Array(); // Create a new, empty array at index i*
  •  for(var j=0; j<cols; j++)*
    
  •  {*
    
  •  	var someNum:int = Random.Range(0,aCards.length);*
    

_ aGrid*[j] = aCards[someNum];_
_
aCards.RemoveAt(someNum);_
_
}_
_
}_
_
BuildDeck();_
_
}*_

class Card extends System.Object
{
* var isFaceUp:boolean = false;*
* var isMatched:boolean = false;*
* var img:String;*
* function Card(img:String)*
* {*
* this.img = img;*
* }*
}

function OnGUI ()
{
* GUILayout.BeginArea (Rect (0,0,Screen.width,Screen.height));*
* BuildGrid();*
* GUILayout.EndArea();*
* print(“building grid!”);*

}

function BuildGrid()
{
* GUILayout.BeginVertical();*
* GUILayout.FlexibleSpace();*
* for(var i=0; i<rows; i++)*
* {*
* GUILayout.BeginHorizontal();*
* GUILayout.FlexibleSpace();*
* for(var j=0; j<cols; j++)*
* {*
_ var card:Object = aGrid*[j];
if(GUILayout.Button(Resources.Load(card.img),GUILayout.Width(cardW)))
{
Debug.Log(card.img);
}
}
GUILayout.FlexibleSpace();
GUILayout.EndHorizontal();
}
GUILayout.FlexibleSpace();
GUILayout.EndVertical();
}*_

function BuildDeck() {

* var totalRobots:int = 4; // we’ve got four robots to work with*
* var card:Object; // this stores a reference to a card*
* for(i=0; i<totalRobots; i++)*
* {*
* var aRobotParts : Array = [“Head”, “Arm”, “Leg”];*
* for(j=0; j<2; j++)*
* {*
* var someNum:int = Random.Range(0, aRobotParts.length);*
* var theMissingPart:String = aRobotParts[someNum];*
* aRobotParts.RemoveAt(someNum);*
* card = new Card(“robot” + (i+1) + “Missing” + theMissingPart);*
* aCards.Add(card);*
* card = new Card(“robot” + (i+1) + theMissingPart);*
* aCards.Add(card);*
* }*
* }*
}

Are you meant to call BuildDeck() earlier? The line with the error is :

aGrid*[j] = aCards[someNum];*

and I cannot see where the array aCards get initialised. Your BuildDeck() appears to do this, but you call this function later in the code. So, when you generate the random someNum and then access that entry in the aCards array, the program stops with the error that the aCards array doesn’t have a someNum entry.