0

カードのデッキを作成する小さなプログラムを作成しようとしています。すべてのコードがコンパイルされますが、テスター クラスを実行しようとすると、次のように表示されます。

スレッド「メイン」での例外 java.lang.ArrayIndexOutOfBoundsException: 52
at cardDeck.giveValue(cardDeck.java:23)
at 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;
 } 
}

テスタークラス:

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());
  }
 }
} 
4

3 に答える 3

5

ネストされたループを見てください。

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

ループの反復ごとにa 多くの時間をインクリメントしていwhileます...つまり、ループ中に簡単aに 52 になり、その時点で例外が発生します。や など、他の方法でも同じ問題がgiveSuitありgiveNameます。他の配列の長さは正確に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フィールドに格納するだけです。

(さらに、Java の命名規則に従うようにクラスの名前を修正することをお勧めします。また、cardDeck特定のインスタンスの状態の論理的な一部ではないフィールド ( やフィールドなどvalues)suitsnamesある場合は、それらを静的にすることをお勧めします。)

于 2013-09-28T14:56:15.030 に答える
0

while ループを for で次のように書き換えます。

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

a++そして、複数の場所で避けてください。

于 2013-09-28T14:57:07.620 に答える