我正在尝试制作一个创建一副牌的小程序。所有代码都会编译,但是当我尝试运行测试器类时,它会说:
线程“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;
}
}
Card Deck课程:
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;
}
}
测试员类:
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());
}
}
}
答案 0 :(得分:5)
看看你的嵌套循环:
while(a < 52) {
for(int m: values) {
// Various things which increment a
}
}
a
循环的每次迭代都会为while
多次递增 ...这意味着您很容易以a
结束在循环期间为52,此时您将获得异常。您在其他方法中也遇到了同样的问题,例如giveSuit
和giveName
。其他方法只是工作,因为你的其他数组的长度精确地划分为52 - 而values
只有10个元素,所以在while
循环的5次迭代之后,你将在{{1}所以在嵌套循环的3次迭代之后,你会爆炸。但为什么你有嵌套循环?
虽然可以修复现有的a = 50
方法,但将其重写为更简单:
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
个对象呢?只需将值/ suit / name传递给构造函数,并将它们存储在Card
个字段中。
(另外,我建议您修改final
类的名称以遵循Java命名约定,并且当您的字段在逻辑上不属于特定实例的状态时 - 例如{{1} 1}},cardDeck
和values
字段 - 您将它们设为静态。)
答案 1 :(得分:0)
使用以下内容重写你的while循环:
for(int a=0; a < 52; a++) {
//
}
并避免在多个地方a++
。
答案 2 :(得分:0)
关于循环结构的其他答案是正确的,但你真正的问题是:
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个值放入值中作为一个简单的修复。