#stack #stack-overflow
#стек #переполнение стека
Вопрос:
Предыстория: моим заданием было написать программу, которая использует связанный список для отслеживания карт в карточной игре (война). Итак, я написал 4 программы: card.java , deckofcards.java , hand.java , war.java (водитель). карта содержит основную информацию. При добавлении в связанный список карточек я использую метод под названием setLast:
nextCard=null;
public card(String a, String b)
{
hand=a;
suit=b;
}
public void setLast(card c)
{
if(nextCard==null)
{
nextCard = c;
}
else
{
nextCard.setLast(c);
}
}
затем в deckofcards.java:
card deck, dea<
public deckofcards()
{
rand = new Random();
dealt = new card("0","0"); //null card place holders
first = new card("0","0");
numcards = 52;
shuffle();
}
public card dealCard()
{
card c=new card("0","0");
if(first!= null)
{
c = first;
first = first.nextCard;
c.nextCard = null;
if(dealt.toString().compareTo("00")==0)
{
dealt = c;
}
else
{
dealt.setLast(c);
}
numcards--;
}
else
{
System.out.println("Deck: ran out of cards");
}
return c;
}
таким образом, deckofcards генерирует 52 случайно (в любом случае предполагается, но это другой вопрос) упорядоченных карты, и руки раздают их экземплярам руки.java в war.java
hand.java:
card cards;
int numcards;
public void getCard(card c)
{
System.out.println("In hand.java,getCard");
if (numcards==0)
{
cards = c;
numcards ;
}
else
{
cards.setLast(c);
}
}
и war.java:
players = new hand[numplayers];
for(int i=0;i<numplayers;i )
{
players[i] = new hand();
}
deck = new deckofcards();
int i=0;
while(i<52)
{
int ii=0;
if((ii<numplayers)amp;amp;(i<52))
{
players[ii].getCard(deck.dealCard());
i ;
ii ;
}
else
{
ii=0;
}
}
выходной сигнал:
В hand.java , получить карточку
В hand.java , получить карточку
Исключение в потоке «main» java.lang.Ошибка StackOverflowError
в card.setLast(card.java:125)
в card.setLast(card.java:125)
в card.setLast(card.java:125)
в card.setLast(card.java:125)
в card.setLast(card.java:125)
в card.setLast(card.java:125)
в card.setLast(card.java:125)
// повторяется 1000 раз…
Конечно, я предоставил только фрагмент кода, который, по моему мнению, вызывает проблему, я могу предоставить весь код по запросу.
Ответ №1:
В вашем списке где-то есть цикл, то есть «A-> B-> C-> D-> B». Есть ли причина, по которой вы используете «заполнители нулевых карточек» вместо значения null? Я заметил, что setLast проверяет значение ‘null’ вместо ’00’ для вашего заполнителя null, но, не видя всего кода, трудно определить, где ваш список попадает в цикл.
Комментарии:
1. Я сделал нулевую карточку, потому что я также добавил функцию поиска в карточку для функции, и я подумал, что это было бы хорошим решением. Кроме того, я не был уверен, как написать «общедоступную карточку dealcard ()». Я не хотел писать метод, который выдает… Мне придется заставить его выдавать исключение, не так ли?