java.lang.ArrayIndexOutOfBoundsException: 0 (реализация стека) - PullRequest
1 голос
/ 23 марта 2012

Я реализую приложение стека, однако каждый раз, когда я помещаю элемент в стек, я получаю 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)   

Спасибо за любую помощь / руководство, я 'Я действительно не уверен в этом.

Ответы [ 3 ]

4 голосов
/ 23 марта 2012

Есть несколько проблем с вашим кодом:

  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];
    }
}
1 голос
/ 23 марта 2012

Я подозреваю, что проблема в этой строке:

stack[top++] = n;

проверить значение, которое передается для верхней переменной

0 голосов
/ 23 марта 2012

Показать создание переменной 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, а затем поместить элемент в эту позицию.

...