java.lang.ArrayIndexOutOfBoundsException:0(堆栈实现)

时间:2012-03-23 04:07:54

标签: java arrays stack indexoutofboundsexception

我正在实现一个堆栈应用程序,但每次我将一个项目推送到堆栈时,我都会收到一个java.lang.ArrayIndexOutOfBoundsException:0。

//stack constructor
public Stack() {
    stack = new int[STACKSIZE];
    top = 0;
}


//push code
public void push(int n) throws Exception {
    if(top == STACKSIZE) {
        throw new Exception("Stack Overflow");
    } else {
        stack[top++] = n;
    }
}



//stack size variable
protected int STACKSIZE;

//get stack size
public int getStackSize() {
    return STACKSIZE;
}

//set stack size
public void setStackSize(int size) {
    STACKSIZE = size;
}

//declaring a new stack object in the GUI class
private Stack stack = new Stack();

//variable for default stack size (class level variable)
private int stackSize = 0;

//setting the size
stack.setStackSize(stackSize);

//code where push is being used (located within a jbutton event)
try {
    int size = stack.getStackSize();
    stack.setStackSize(++size);
    String inputNumber = EquationLabel.getText().replaceAll(remove, replaceWith);
    int number = Integer.parseInt(inputNumber);
    clear();
    stack.push(number);
} catch (NumberFormatException error) {
    MessageLabel.setText("Error: " + error.getMessage());
    error.printStackTrace();
} catch (Exception error) {
    MessageLabel.setText("Error: " + error.getMessage());
    error.printStackTrace();
}

//stack trace output
java.lang.ArrayIndexOutOfBoundsException: 0
at Stack.Stack.push(Stack.java:66)
at calculator.Calculator.actionPerformed(Calculator.java:268)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at               javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.java:6505)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
at java.awt.Component.processEvent(Component.java:6270)
at java.awt.Container.processEvent(Container.java:2229)
at java.awt.Component.dispatchEventImpl(Component.java:4861)
at java.awt.Container.dispatchEventImpl(Container.java:2287)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
at java.awt.Container.dispatchEventImpl(Container.java:2273)
at java.awt.Window.dispatchEventImpl(Window.java:2713)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:707)
at java.awt.EventQueue.access$000(EventQueue.java:101)
at java.awt.EventQueue$3.run(EventQueue.java:666)
at java.awt.EventQueue$3.run(EventQueue.java:664)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
at java.awt.EventQueue$4.run(EventQueue.java:680)
at java.awt.EventQueue$4.run(EventQueue.java:678)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:677)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)   

感谢您的帮助/指导,我真的不确定这个。

3 个答案:

答案 0 :(得分:4)

您的代码存在多个问题:

  1. 您永远不会初始化变量STACKSIZE。这是一个int所以它 只是发生默认为零。首次初始化时,它的值为零 存储阵列。
  2. 您的setStackSize方法会更改STACKSIZE值,但会更改public class Stack { private int[] storage; private int size; public Stack(int capacity) { super(); storage = new int[capacity]; } public void push(int number) { if(storage == null) return; if(size >= storage.length) throw new RuntimeException("Stack Overflow"); storage[size] = number; ++size; } public int pop() { if(storage == null) throw new RuntimeException("No storage"); if(size == 0) throw new RuntimeException("Stack Underflow"); --size; return storage[size]; } } 对内部存储阵列没有任何作用(不会尝试调整它的大小)。
  3. 在任何情况下,因为你初始化你的空数组 构造函数,你永远不能添加任何元素,这就是你的原因 得到一个ArrayOutOfBoundsException。
  4. 这些都是编码错误,但您也有一些概念错误。

    1. 你还没想到你想要一个有初始的堆栈 固定大小,或动态增长的大小。因为这个你 在代码中混合使用这两个概念并导致错误。
    2. 如果你决定使用固定大小的数组,那么你可以调整你的类更像这样:

      {{1}}

答案 1 :(得分:1)

我怀疑问题出在这一行:

stack[top++] = n;

检查为顶部变量传递的值

答案 2 :(得分:0)

在您的问题中显示stack变量的创建。无论如何, int stack[]=new int[size];

此外,在函数setStackSize()中完成此操作。为此,在类public int stack[];的开头创建数组堆栈,并在函数getStackSize中对其进行初始化,如下所示:stack=new int[size];

由于您已将堆栈的大小增加1,这意味着您希望从位置1而不是0开始堆栈。因此,初始化top=0;

在推送功能中,它应该是:stack[++top]=n;你应该先增加top的值,然后将项目放在那个位置。