【问题标题】:java.lang.ArrayIndexOutOfBoundsException: 0 (stack implementation)java.lang.ArrayIndexOutOfBoundsException: 0(堆栈实现)
【发布时间】:2012-04-07 17:01:39
【问题描述】:

我正在实现一个堆栈应用程序,但是每次我将一个项目推送到堆栈上时,我都会收到一个 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)   

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

【问题讨论】:

  • 你在哪里创建堆栈变量?
  • 你在哪里创建数组?
  • 堆栈变量正在 gui 类中创建。我会发布更多代码。

标签: java arrays stack indexoutofboundsexception


【解决方案1】:

您的代码存在多个问题:

  1. 您永远不会初始化变量STACKSIZE。它是一个 int 所以它 只是发生默认为零。当你第一次初始化你的 存储阵列。
  2. 您的 setStackSize 方法更改了 STACKSIZE 值,但它 对内部存储阵列不做任何事情(不尝试调整它的大小)。
  3. 无论如何,既然你在你的 构造函数,你永远不能向它添加任何元素,这就是为什么你 获取 ArrayOutOfBoundsException。

这些都是编码错误,但您也有一些概念性错误。

  1. 您尚未决定是否需要具有初始值的堆栈 固定大小,或动态增长的大小。正因为如此,你 在您的代码中混合了这两个概念,这会导致错误。

如果您决定使用固定大小的数组,那么您可以将您的类调整为更像这样:

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];
    }
}

【讨论】:

    【解决方案2】:

    我怀疑问题出在这一行:

    stack[top++] = n;
    

    检查为顶部变量传递的值

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2013-01-25
        • 2010-11-27
        • 2013-12-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-07
        • 2019-11-11
        • 2017-07-27
        相关资源
        最近更新 更多