2015-03-12 4 views
0

Так что я создаю конструктор колоды для карточной игры, в которой цикл for не работает. Это код для него, и игнорировать третью переменную целого в конструкторе для этого не решает проблему, и поэтому я прокомментировал это:My Nested For Loop не работает

public Deck(String[] ranks, String[] suits, int[] values) { 
    cards = new ArrayList<Card>(); 
    for(int a = 0; a<=ranks.length; a++){ 
      for(int b=0; b<=suits.length;b++){ 
       cards.add(new Card(ranks[a],suits[b], 0)); 
       System.out.println(cards); 
       size+=1; 
      } 
     } 
    } 

Мои вложен цикл не работает, однако. Я создал набор костюмов и рангов для всех карт в колоде от одного до туза и массив костюмов, содержащий «Hearts», «Spades», «Clubs», «Diamonds». Вот вывод для печати, который я получал при устранении неполадок, а также сообщение об ошибке, которое я получаю вместе с ним.

[(One of Hearts (point value = 0)][(One of Hearts (point value = 0), (One of Spades (point value = 0)] 
    [(One of Hearts (point value = 0), (One of Spades (point value = 0), (One of Clubs (point value = 0)] 
    [(One of Hearts (point value = 0), (One of Spades (point value = 0), (One of Clubs (point value = 0), (One of Diamonds (point value = 0)] 
    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 4 
     at Deck.<init>(Deck.java:36) 
     at DeckTester.main(DeckTester.java:14) 

Мое понимание было то, что вложенная цикл будет закончить список костюмов массива, который содержит 4 масти так же, как это имеет в печатной продукции. Тем не менее, я думал, что после того, как он пробежал четыре раза, вместо того, чтобы создавать ошибку, цикл «a» для этого переместится в следующий элемент в массиве рангов, а не заканчивается. Таким образом, его вывод в упорядоченных парах будет выглядеть так:

(0,0) (0,1) (0,2) (0,3) (1,0) (1,1) (1,2) (1,3) etc. 

Любая помощь будет принята с благодарностью, и я благодарю вас за ваше время.

+0

См. Также http://stackoverflow.com/questions/5554734/what-causes-a-java-lang-arrayindexoutofboundsexception-and-how-do-i-prevent-it – Raedwald

ответ

4

Массив из n элементов имеет индексы от 0 до n-1. n - недопустимый индекс для такого массива.

Ваши показатели отключены одним. Это должно быть:

for(int a = 0; a<ranks.length; a++){ 
     for(int b=0; b<suits.length;b++){ 
      cards.add(new Card(ranks[a],suits[b], 0)); 
      System.out.println(cards); 
      size+=1; 
     } 
    } 
} 
+1

Черт, ты избил меня! Для OP: Length задает длину массива (то есть 4 элемента), однако эти элементы нулевые индексируются, то есть 0, 1, 2, 3. –

0

Вы можете использовать цикл for-each, если индекс массива не нужен.

Это избавляет вас от подобных ошибок.

for(String ra : ranks){ 
     for(Stirng su : suits){ 
      cards.add(new Card(ra, su, 0)); 
      System.out.println(cards); 
      size+=1; 
     } 
    } 
} 

Легко читается, но вы не можете использовать его в любой ситуации.