Ari
Ari

Reputation: 1036

java.lang.ArrayIndexOutOfBoundsException: 0 (stack implementation)

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

Answers (3)

user1284849
user1284849

Reputation: 83

I suspect problem is at this line:

stack[top++] = n;

check the value which is passed for top variable

Upvotes: 1

Perception
Perception

Reputation: 80603

There are multiple issues with your code:

  1. You never initialize the variable 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.
  2. Your setStackSize method changes the STACKSIZE value, but it does nothing with the internal storage array (doesn't attempt to resize it).
  3. In any case, since you initialize an empty array in your 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.

  1. You haven't decided wether you want a stack that has an initial 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:

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

Exorcist
Exorcist

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

Related Questions