Проблема с исключением StackEmptyException - PullRequest
0 голосов
/ 20 октября 2018

У меня возникли проблемы при компиляции цикла for в моем классе тестирования.

В LabApp, классе тестирования, у меня в настоящее время есть

import generics.StackFullException;
import generics.StackEmptyException;


public class Lab4App {
       public static void main(String[] args)throws StackFullException, StackEmptyException {
        try {
        DiscardPile<Card> discardPile = null; 
        discardPile = new DiscardPile<Card>();
        discardPile.push(new Card(8));
        discardPile.push(new Card(32));
        discardPile.push(new Card(48));
        discardPile.push(new Card(2));
        discardPile.push(new Card(17));
        discardPile.push(new Card(20)); //removeTopCard should remove all that's above
        discardPile.push(new Card(25));
        discardPile.push(new Card(50));
        discardPile.push(new Card(19));
        discardPile.push(new Card(41)); //10 Cards that must be popped

        for(int i = 0; i < discardPile.getSize(); i++) {
            Card var = discardPile.pop(); //pops the cards that are above
                System.out.println(var.getRankAsString() + " of " + var.getSuitAsString());
        }

        }
        catch (StackEmptyException SEE) {
            System.out.println("StackEmptyException: " + SEE.getMessage());
        }
        catch (StackFullException SFE) {
            System.out.println("StackFullException: " + SFE.getMessage());
       }
}
}

Он печатает желаемый вывод

4 of Spades
8 of Diamonds
K of Spades
A of Diamonds
9 of Diamonds
6 of Diamonds
4 of Clubs
J of Spades
8 of Hearts
10 of Clubs

но он возвращает

Exception in thread "main" java.util.EmptyStackException

красным в конце

Я думаю, проблема в том, что я создал конструктор по умолчанию, который почти идентичен конструктору стекакласс, где pop, peek и push равны

public class DiscardPile<T> extends Stack<T>  { //subclass of its parent Stack
    private T[] data;
    private int size;


    //private static final int maxSize = 52;

    public DiscardPile() throws StackFullException, StackEmptyException {
        //this.data = (T[]) new Object[maxSize];
        this.size = 52; //52 is supposed to be the max value
    }
    /**
     * Constructs a new Stack with capacity specified by user
     * @param size the size of the Stack
     */
    public DiscardPile(int size){
        //this.data = (T[]) new Object[size];
        this.size = 0;
    }

    public int getSize(){ // getter
        return this.size;
    }

Если я введу 10 вместо 52, то в конце все будет работать без ошибок (так как есть 10 карт), если я введу 0,это просто не печатает.Ноль должен быть начальным значением.

Любая помощь будет принята с благодарностью!

РЕДАКТИРОВАТЬ: открытый класс DiscardPile расширяет возможности стека Iterable {

//subclass of its parent Stack

    //private T[] data;
    private int size;


    private static final int MAX_SIZE = 52;

    public T push(T mink) {
        if (this.size() < this.MAX_SIZE) {
            super.push(mink);
        }
        return mink;
    }

    public DiscardPile() throws StackFullException, StackEmptyException {
        //this.data = (T[]) new Object[MAX_SIZE];
        this.size = 10; 
    }

    public DiscardPile(int size){
        //this.data = (T[]) new Object[size];
        this.size = 0;
    }

    public int getSize(){ // getter
        return this.size;
    }

Ответы [ 3 ]

0 голосов
/ 20 октября 2018

Вы должны использовать функцию size(), предоставляемую классом Stack, и если вы хотите установить максимальный предел, вы можете сделать что-то вроде

public class DiscardPile<T> extends Stack<T> {

private static int MAX_SIZE = 52;

public T push(T mink) {
    if (this.size() < this.MAX_SIZE) {
        super.push(mink);
    }
    return mink;
}
}
0 голосов
/ 20 октября 2018

Все указали на размер вопроса.Вы можете перебирать свой собственный класс Stack.Реализуйте интерфейс Iterable

public class DiscardPile<T> extends Stack<T> implements Iterable<T> {

   @Override
   public Iterator<T> iterator() {
     return new Iterator<T>() {
         // Implementation your iterator, methods like hasNext etc.
     }
   }
}

Затем переберите свой стек

Iterator iterator = discardPile.iterator();
while (iterator.hasNext()) {
   //your code
}
0 голосов
/ 20 октября 2018

Вы используете функцию getSize() для возврата размера, однако размер всегда жестко задан в 52, и это приводит к тому, что ваш цикл for пытается получить больше, когда ничего не доступно.

Почему у вас есть собственный класс, который реализует Stack<T>?Кажется, он не добавляет много функциональности.

Если вы хотите продолжать использовать свой собственный класс, вы можете:

  • использовать цикл for, который продолжает появляться, в то время как isEmpty() равно false.
  • использовать функцию size(), которая по умолчанию находится в классе Stack
  • написать что-то в вашем пользовательском классе, который отслеживает размер при добавлении новых элементов.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...