2015-06-24 137 views
0

我写了这个程序来初始化和创建一副牌,洗牌,然后交出N张牌。尽管每次编译都会顺利进行,但是当我运行该程序时,它会抛出一个不同的ArrayIndexOutOfBounds(:52或54)。我使用System.out.println(1)检查了错误,更改和交换了索引,更改了数组的长度等等。但我很难过......也许你能帮助我?为什么在这个程序中出现“ArrayIndexOutOfBounds”错误?

public class Deal 
{ 

public static void main(String[] args) 
{ 

    int N = Integer.parseInt(args[0]); 
    int hand = 5; 

    String[] rank = 
    { 
     "2", "3", "4", "5", "6", "7", "8", "9", "10", 
     "Jack", "Queen", "King", "Ace" 
    }; 

    String[] suit = {"Spades", "Hearts", "Clubs", "Diamonds"}; 

    // Create Deck 
    String[] deck = new String[rank.length * suit.length]; 

    // Fill the deck with cards 
    for (int i = 0; i < suit.length; i++) 
    { 
     for (int j = 0; j < rank.length; j++) 
     { 
      //System.out.println(1); 
      deck[rank.length*i + j] = rank[j] + " of " + suit[i]; 
      System.out.println(deck[rank.length*i +j]); 
     } 
    } 

    // Shuffle deck 
    for (int i = 0; i < deck.length; i++) 
    { 
     int r = i + (int)(Math.random() * (N-1)); 
     String t = deck[i]; 
     deck[i] = deck[r]; 
     deck[r] = t; 
    } 

    // Count number of cards dealt 
    int counter = 0; 

    while (N != 0 && counter <= deck.length) 
    { 
     for (int i = counter; i < hand + counter; i++) 
     { 
      System.out.println(deck[i]); 
      counter++; 
     } 

     N--; 
     System.out.println(); 
    } 
} 
} 
+1

你可以分享堆栈跟踪吗? –

回答

3

的问题是在你的洗牌代码:

for (int i = 0; i < deck.length; i++) 
{ 
    int r = i + (int)(Math.random() * (N-1)); 
    String t = deck[i]; 
    deck[i] = deck[r]; 
    deck[r] = t; 
} 

有没有保证r将在范围 - 只要i内结束的N得到,它可能会失败取决于随机生成的数字。

更好:使用Collections.shuffle

Collections.shuffle(Arrays.asList(deck)); 

当你定,你会然后这里有一个问题:

while (N != 0 && counter <= deck.length) 
{ 
    for (int i = counter; i < hand + counter; i++) 
    { 
     System.out.println(deck[i]); 

你有什么期望时counter == deck.length发生?

基本上,答案像这样所有问题包括以下步骤:

  • 摸出其中代码失败
  • 工作如何/为什么你会得到一个无效的指数
  • 制定出你实际上想要做的,以便保持在阵列的范围内
  • 实施变化
+0

非常感谢您的回答。我通过改变N-1在 int r = i +(int)(Math.random()*(N-1)); 对Ni和while条件以及.. –

+0

@SamuelNuzbrokh:如果你打算保留混洗代码,我建议使用'java.util.Random'而不是调用'Math.random()'和相乘...但我仍然建议使用'Collections.shuffle'来代替... –

相关问题