Reputation: 1036
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.
Upvotes: 1
Views: 899
Reputation: 83
I suspect problem is at this line:
stack[top++] = n;
check the value which is passed for top variable
Upvotes: 1
Reputation: 80603
There are multiple issues with your code:
STACKSIZE
. It is an int so it
just happens to default to zero. It has this value of zero when you first initialize your
storage array.setStackSize
method changes the STACKSIZE
value, but it
does nothing with the internal storage array (doesn't attempt to resize it).These are all coding errors, but you have some conceptual errors as well.
If you decide to go with a fixed size array then you can adjust your class to be more like this:
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];
}
}
Upvotes: 4
Reputation: 252
Show the creation of the stack
variable in your question itself. Anyways,
int stack[]=new int[size];
Furthermore get this done in the function setStackSize()
itself. For this, create the array stack at the beginning of the class public int stack[];
and initialise it in the function getStackSize
as follows : stack=new int[size];
And since you have increased the size of the stack by 1,that means you want to start the stack from position 1 instead of 0. So,initialise top=0;
.
And in the push function it should be : stack[++top]=n;
You should increment the value of top first and then place the item at that position.
Upvotes: 0