I’m implementing a stack application, however every time I push an item onto the stack I receive a 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)
Thanks for any help/guidance, I’m really unsure on this one.
There are multiple issues with your code:
STACKSIZE. It is an int so itjust happens to default to zero. It has this value of zero when you first initialize your
storage array.
setStackSizemethod changes theSTACKSIZEvalue, but itdoes nothing with the internal storage array (doesn’t attempt to resize it).
constructor, you can never add any elements to it, this is why you
get an ArrayOutOfBoundsException.
These are all coding errors, but you have some conceptual errors as well.
fixed size, or one that dynamically grows. And because of this you
are mixing both concepts in your code and it is causing bugs.
If you decide to go with a fixed size array then you can adjust your class to be more like this: