2012-03-23 133 views
1

我实施堆叠应用,但是每次我推一个项目到堆栈我接收java.lang.ArrayIndexOutOfBoundsException:0.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) 

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

+2

哪里是U创建堆栈变量? – redDevil 2012-03-23 04:10:31

+0

你在哪里创建数组? – 2012-03-23 04:16:59

+0

堆栈变量正在gui类中创建。我会发布更多的代码。 – Ari 2012-03-23 04:22:19

回答

4

有多个问题与您的代码:

  1. 你永远不会初始化变量STACKSIZE。它是一个整数,所以它 只是发生默认为零。当您第一次初始化您的存储阵列时,它的值为零。
  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]; 
    } 
} 
1

我怀疑问题出在这行:

stack[top++] = n; 

检查被传递顶级变量

0

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

此外,得到这个功能setStackSize()本身完成。为此,在类public int stack[];的开始创建数组堆栈,如下初始化它在功能getStackSizestack=new int[size];

既然你已经通过1增加堆栈的大小,这意味着你要开始堆栈从位置1而不是0.因此,初始化top=0;

而在推功能它应该是:stack[++top]=n;你应该增加顶部的价值,然后将该项目放在该位置。

+0

酷感谢回复,我正在尝试一切。 – Ari 2012-03-23 04:42:29