2013-09-28 50 views
0

抛出我试图做一个小程序,创建一个扑克牌我想不通。所有的代码编译,但是当我尝试运行测试类,它说:为什么ArrayIndexOutOfBoundsException异常这里

异常线程“main” java.lang.ArrayIndexOutOfBoundsException:52
在cardDeck.giveValue(cardDeck.java:23 )
在CardTest.main(CardTest.java:6)

我只用了几个星期的java,所以我不知道到底是哪里的问题,或如何解决它。我会很感激任何帮助。
卡类:

public class Card { 
private int value; 
private String name; 
private String suit; 

public void setValue(int v){ 
    value = v; 
} 
public int getValue(){ 
    return value; 
} 

public void setName(String n){ 
    name = n; 
} 
public String getName(){ 
    return name; 
} 

public void setSuit(String s){ 
    suit = s; 
} 
public String getSuit(){ 
    return suit; 
} 

} 

张牌类:

public class cardDeck { 

int [] values = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11}; 
String[] names = {"Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "King", "Queen", "Jack", "Ace"}; 
String[] suits = {"Clubs", "Spades", "Hearts", "Diamonds"}; 

public Card[] giveName (Card[] d){ 
int j = 0; 
while(j < 52){ 
    for(String k: names){ 
    d[j] = new Card(); 
    d[j].setName(k); 
    j++; 
    } 
    } 
    return d; 
} 

public Card[] giveValue(Card[] e){ 
    int a = 0; 
    while(a < 52){ 
    for(int m: values){ 
    if((e[a].getName().equals("King")) || (e[a].getName().equals("Ten")) || (e[a].getName().equals("Queen")) || (e[a].getName().equals("Jack"))){ 
     e[a].setValue(10); 
     a++; 
    }else if(e[a].getName().equals("Ace")){ 
     e[a].setValue(11); 
     a++; 
    }else{ 
     e[a].setValue(m); 
     a++; 
    } 
    } 
    } 
    return e; 
    } 

public Card[] giveSuit(Card[] f){ 
    int b = 0; 
    while(b < 52){ 
    for(String l:suits){ 
    f[b].setSuit(l); 
    b++; 
    } 
    } 
    return f; 
} 
} 

Tester类:

class CardTest { 
public static void main(String[] args){ 
    Card[] deck = new Card[52]; 
    cardDeck playingCards = new cardDeck(); 
    playingCards.giveName(deck); 
    playingCards.giveValue(deck); 
    playingCards.giveSuit(deck); 




    for(int q = 0; q < 52; q++){ 
    System.out.println("A "+deck[q].getName()+ " of " +deck[q].getSuit()+ " " +deck[q].getValue()); 
    } 
} 
} 
+2

为什么你用'while'循环用手动计数器代替'for'循环? – chrylis

+1

哪一行是23?你使用调试器时看到了什么? –

回答

0

约环structor其他的答案是正确的,但你真正的问题是这样的:

int [] values = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11}; 

... 

int a = 0; 
while(a < 52) { 
    for(int m: values) { 
    // stuff 
    a++; 
    } 
} 

所以会发生什么是第一个循环:

Loop # -> a 
0 -> 0 to 10 
1 -> 11 to 20 
2 -> 21 to 30 
3 -> 31 to 40 
4 -> 41 to 50 
5 -> 51 to 60 

如此循环5 51小于52所以它继续设置值循环10次。

我会把13个值作为一个简单的修复。

5

看看你的嵌套循环:

while(a < 52) { 
    for(int m: values) { 
    // Various things which increment a 
    } 
} 

你在对于while循环的每次迭代,这意味着你很容易在循环过程中以a为52结束,此时你会得到一个异常。你有其他方法同样的问题太多,如giveSuitgiveName。其他方法只是工作,因为你的其他阵列具有长度其中究竟划分成52 - 而values只有10元,打完while循环的5次迭代你会在a = 50 ...所以之后3次嵌套的迭代循环,你会炸毁。但为什么你有嵌套循环呢?

虽然有可能解决现有giveValue方法,这将是更简单重写为:

public Card[] giveValue(Card[] e) { 
    for (int i = 0; i < 52; i++) { 
    int rawValue = (i % 13) + 2; // Value 2-14 
    if (rawValue == 14) { 
     e[i].setValue(11); // The ace 
    } else if (rawValue >= 11 && rawValue <= 13) { 
     e[i].setValue(10); // Jack to King 
    } else { 
     e[i].setValue(rawValue); 
    } 
    } 
    return e; 
} 

我真的建议重新设计 - 我建议你让你的Card类不可改变的。想想现实生活中 - 它创建后卡不会改变,所以为什么你Card对象应该吗?你只需要把这个值/西装/名称到构造函数,并将其存储在final领域。

(另外,我建议您修复cardDeck类的名称遵循Java的命名约定,当你有哪些是特定实例的状态不是逻辑部分领域 - 比如你的valuessuitsnames领域 - 你让他们静)

+0

也所有其他.. – Scolytus

+0

@Scolytus:所有其他的什么?您的评论的背景很少。你是指方法名称? –

+0

在你编辑你的文章之前很清楚;)这个错误发生在许多循环中,而不仅仅是一个。 – Scolytus

0

改写了你的while循环是这样的:

for(int a=0; a < 52; a++) { 
    // 
} 

,避免a++在多个位置。

+0

我想在嵌套循环的每次运行后递增一次,而不是在嵌套循环结束时递增。这就是我使用while循环的原因。 – user2793426

相关问题