2013-09-28 78 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

相關問題