索引超出范围的异常(Stacks)

时间:2013-11-25 13:53:30

标签: java generics stack

我目前正在研究泛型类和堆栈。我已经创建了一个带有arrayList的类,并为push,peek和pop创建了方法。

每当我运行驱动程序,虽然我得到了一个边界索引异常,我很困惑为什么。任何帮助都会很棒:

GenericStack class



public class GenericStack <T> {

  public ArrayList<T> stack = new ArrayList<T>();

  private int top = 0; 

  public int size () {return top; };

  public void push (T element){

    stack.add(element);

    top++;    
  }

  public T pop() {

    if (top == -1) {
      return null;   //means stack is empty
    }

    T val = stack.get(top);

    stack.remove(top);

     top--;
     return val;
  }

  public T peek(){
    if (top == -1){
      return null;
    }

    T val = stack.get(top);

    return val;

  }
}

和我的GenericDriver类

public class GenericDriver extends GenericStack {

public static void main (String [] args){

GenericStack<String> strings = new GenericStack<String>(); 


                    strings.push ( "hi");
                    strings.push ("how are you?");
                    strings.push ("Hi again");
                    strings.push ("One more");


    if (strings.size() == 0) {
      System.out.println("Stack is empty.");
    } else { 
      System.out.println("Stack contains " + strings.size() + " items.");
    {   
      System.out.println("top value: (using pop)  " + strings.pop()); 

      System.out.println("Stack now contains: " + strings.size() + " items");

      System.out.println("The new top value, using peek:  " + strings.peek());
    }
  }

如果有人能告诉我为什么我会得到这个例外,那就很棒了

4 个答案:

答案 0 :(得分:4)

你的筹码看起来像这样:

"One more"
"Hi again"
"how are you?"
"hi"    

现在top 4

执行pop时,您试图在 ArrayList 中的索引4处获取元素,但是数组在Java中是从零开始的,没有元素4,元素在[0-3]范围内你应该在开始时将top初始化为-1而不是0,所以当你试图获得“top”元素时,你不会得到IndexOutOfBoundsException

答案 1 :(得分:1)

先前减少top以从列表中弹出元素。

top--;
T val = stack.get(top);
stack.remove(top);

因为top有元素的数量,因为数组是从零开始的,所以索引总是比元素的数量少一个。

答案 2 :(得分:1)

这里的问题是你将top作为0开始。当向堆栈添加一个项目时,你会增加顶部。现在你的最高值是1.但是你应该在pop()中使用的索引应该是0而不是1,因为ArrayList的第一个索引从0开始。

因此,您应该将top初始化为-1而不是0.(这也是您稍后检查以表示空堆栈的内容)。

答案 3 :(得分:0)

On first push operation GenericStack.push("java") increases to "1". Then if we 

执行GenericStack.pop(),我们试图从索引'1'获取 对象未初始化。下面的代码更改应该有效: -

private int top = -1;   
public int size () {   
return top;   
}   
public void push (T element){   
top++;   
stack.add(element);   
}