Java StackEmptyException异常问题

Java StackEmptyException异常问题,java,exception,constructor,Java,Exception,Constructor,在测试类中编译此for循环时遇到问题 在测试类LabApp中,我目前有 import generics.StackFullException; import generics.StackEmptyException; public class Lab4App { public static void main(String[] args)throws StackFullException, StackEmptyException { try {

在测试类中编译此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());
       }
}
}
但它又回来了

Exception in thread "main" java.util.EmptyStackException
最后是红色的

我认为问题在于我创建的默认构造函数,它与Stack类的构造函数几乎相同,其中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;
    }
public类DiscardPile扩展了堆栈{//其父堆栈的子类
私有T[]数据;
私有整数大小;
//私有静态最终int maxSize=52;
public DiscardPile()抛出StackFullException、StackEmptyException{
//this.data=(T[])新对象[maxSize];
this.size=52;//52应该是最大值
}
/**
*使用用户指定的容量构造新堆栈
*@param size堆栈的大小
*/
公共文件堆(整型大小){
//this.data=(T[])新对象[大小];
此值为0.size=0;
}
public int getSize(){//getter
返回此.size;
}
如果我输入10而不是52,它工作正常,最后没有错误(因为有10张卡),如果我输入0,它就不会打印。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;
    }
//其父堆栈的子类
//私有T[]数据;
私有整数大小;
私有静态最终整数最大值=52;
公共T推(T水貂){
if(this.size()
您正在使用
getSize()
函数返回大小,但是大小总是硬编码为
52
,这会导致
for
循环在没有可用时尝试弹出更多

为什么有一个自定义类实现了
堆栈
?它似乎没有添加多少功能

如果要继续使用自定义类,可以:

  • isEmpty()
    为false时,使用一个持续弹出的for循环
  • 使用默认位于堆栈类中的
    size()
    函数
  • 在自定义类中编写一些东西,以便在添加新项目时跟踪大小
您应该使用
堆栈
类提供的
size()
函数,如果您想强制执行最大限制,可以执行以下操作

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;
}
}
公共类丢弃堆栈扩展堆栈{
私有静态int MAX_SIZE=52;
公共T推(T水貂){
if(this.size()
每个人都指出了大小问题。您可以迭代自定义堆栈类。实现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.
     }
   }
}

删除size变量并使用Stack classes提供的
size()
函数为什么要扩展
Stack
?@andreTobilko出于某些原因,它必须是Stack的子类完全删除size变量并使用size()而不是it@AbdullahRazzaki像这样?public DiscardPile()抛出StackFullException,StackEmptyException{this.data=(T[])新对象[MAX_SIZE];this.SIZE=getSize();}它仍然不打印任何东西,我需要它将这个类(DiscardPile)变成堆栈的子类,因此它就是这样。如果我将它设置为size()或getSize(),它仍然不起作用我写了public t push(t elt){if(this.size()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
}