Проблема активации метода класса - PullRequest
0 голосов
/ 26 января 2019

У меня есть класс Deck_of_Cards, в котором есть конструктор по умолчанию, который назначает вновь определенный массив размером 52 в «deck», а затем активирует метод обновления класса.

В методе обновления используется вложенный цикл forназначить карты в колоду, а затем активировать метод класса shuffle, который, как вы, наверное, догадались, использует цикл for для рандомизации расположения всех элементов массива колода.

При выполнении этого тестового кода:

public class test {

Deck_of_Cards X = new Deck_of_Cards();

int drawCount = 5;
for(int i = 0; i < drawCount; i++)

printCard(X.drawCard());
}
//Outputs the given card's data as "<rank> of <suit>".
public static void printCard(Card c) {
String st;

    if(c.getRank() == '1')
        st = c.getRank() + "0 of " + c.getSuit();

    else if(c.getRank() == 'A')
        st = "Ace of " + c.getSuit();

    else if(c.getRank() == 'J')
        st = "Jack of " + c.getSuit();

    else if(c.getRank() == 'Q')
        st = "Queen of " + c.getSuit();

    else if(c.getRank() == 'K')
        st = "King of " + c.getSuit();

    else
        st = c.getRank() + " of " + c.getSuit();

//NOTE: Could of had an if statement, but I've decided to
//use a switch statement instead to "switch things up".

switch(c.getSuit())
{
case 'S':   st += "pades";
break;
case 'C':   st += "lubs";
break;
case 'D':   st += "iamonds";
break;
case 'H':   st += "earts";
break;
}

System.out.println(st);
}
}

Я получаю:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 51
    at Deck_of_Cards.shuffle(Deck_of_Cards.java:47)
    at Deck_of_Cards.refresh(Deck_of_Cards.java:39)
    at Deck_of_Cards.<init>(Deck_of_Cards.java:21)
    at test.main(test.java:25)
public class Card {
    private char suit;
    private char rank;

    //Constructor 
    public Card(char s, char r) 
    {
        // Suit if-statement
        if (s == 'C' || s == 'D' || s == 'H' || s == 'S' )
        {
            s = suit;
        }
        else 
        {
            throw new IllegalArgumentException("Not a valid suit!");
        }

        // Rank if-statement
        if (r == 'A' || r == '2' || r == '3' || r == '4' || r == '5' || r == '6' || r == '7' || r == '8' || r == '9' || r == 'J' || r == 'Q' || r == 'K')
        {
            r = rank;
        }
        else 
        {
            throw new IllegalArgumentException("Not a valid rank!");
        }

    }

    // Accessors
    public char getRank()
    {
        return rank;
    }

    public char getSuit()
    {
        return suit;
    }
}
import java.util.*;

public class Deck_of_Cards {

    private Card deck [];
    private int position;


    Random rng = new Random();


    public Deck_of_Cards ()
    {
        deck = new Card[51];


        refresh();
    }

    public void refresh()
    {   
        char suit[] = {'C', 'D', 'H', 'S'};
        char rank[] = {'A', '2', '3', '4', '5', '6', '7', '8', '9', 'J', 'Q', 'K'};

        int index = 0;
        for (int i = 0; i < suit.length; i++)
        {
            for (int j = 0; j < rank.length; j++) 
            {
                deck[index] = new Card(suit[i], rank[j]);
                index++;
            }
        }

        shuffle();
    }

    public void shuffle()
    {
        for (int x = deck.length; x >= 0; x--)
        {
            position = rng.nextInt(x+1);
            Card g = deck [x];

            deck[x] = deck[position];
            deck[position] = g;

            //Reseting position back to zero
            if(x == 0)
            {
                position = 0;
            }
        }



    }

    public Card drawCard()
    {
        return deck[position];
    }

}

1 Ответ

0 голосов
/ 26 января 2019

Индексы массива варьируются от 0 до length-1.Если вы попытаетесь получить доступ к индексу length, вы получите ArrayIndexOutOfBoundsException, поскольку самый высокий индекс - length-1.

Измените

for (int x = deck.length; x >= 0; x--) 

в вашем методе shuffle()до

for (int x = deck.length-1; x >= 0; x--)
...