2012-03-23 144 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