java.lang.ArrayIndexOutOfBoundsException的原因

时间:2015-10-02 02:16:08

标签: java string arraylist stack pop

知道这条线有什么问题吗? outStr[i]=(String) s.pop();

import java.util.ArrayList;
import java.util.Scanner;

public class StringWordReverse {

    public String[] StringToWord(){
        Scanner sc = new Scanner(System.in);
        sc.useDelimiter(" ");
        ArrayList<String> wordList= new ArrayList<String>();
        String sc_in= sc.nextLine();
        String[] sc_split=sc_in.split(" +");
        for (int i=0; i<sc_split.length; i++){
            wordList.add(sc_split[i]);
        }

        String[] stringArr= new String[wordList.size()];
        for (int i=0; i<wordList.size(); i++){
            stringArr[i]= wordList.get(i);
        }
        return stringArr;


    }

    public String[] reverseWords(String[] words){
        Stack<String> s= new Stack<String>();
        String[] outStr=new String[words.length];
        for (int i=0; i<words.length; i++){
            s.push(words[i]);
        }
        for (int i=0; i<words.length; i++){
            System.out.println(s.stackSize());
            outStr[i]=(String) s.pop();
        }

        return outStr;  

    }

    public static void main(String[] argc){
        StringWordReverse swr = new StringWordReverse();


        String[] inputWords= swr.StringToWord();
        String[] outputWords=swr.reverseWords(inputWords);
        for (int i=0; i<outputWords.length;i++)
            System.out.println(outputWords[i]);


        return;
    }



}

这是我的Stack类:

    import java.util.ArrayList;

public class Stack<E> {
    private ArrayList<E> s = new ArrayList<E>();
    private static int size=0;

    public void push(E item){
        s.add(item);
        size++;
        return;
    }

    public E pop(){
        size--;
        return s.remove(size-1);

    }

    public int stackSize(){
        return size;
    }


}

这是我收到的错误:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
    at java.util.ArrayList.elementData(ArrayList.java:400)
    at java.util.ArrayList.remove(ArrayList.java:477)
    at XYZ.Stack.pop(Stack.java:16)
    at XYZ.StringWordReverse.reverseWords(StringWordReverse.java:35)
    at XYZ.StringWordReverse.main(StringWordReverse.java:47)

3 个答案:

答案 0 :(得分:2)

此代码中的一些错误信息:

  • 您使用原始类型而不是泛型。让编译器帮助您(大多数)运行时类型错误:Stack<String> stack = new Stack<>()

  • Stack.pop中,您永远不会检查是否有要弹出的元素。如果堆栈为空,您应该对其进行测试并抛出异常,例如NoSuchElementException

  • Stack.pop
  • ,您正在递减大小,然后删除项size - 1,因此基本上减少了两次。这应该是:s.remove(--size);

答案 1 :(得分:1)

您正在减小尺寸变量之前使用相同尺寸的变量从堆叠中取出项目。因此,当您使用剩下的一个项目调用pop时,将大小减小为0,然后尝试删除位置-1处的项目。

为什么在列表中已经有一个变量来维护自己的大小变量?

答案 2 :(得分:1)

尝试更改代码的这一部分:

public E pop(){
    size--;
    return s.remove(size-1);
}

到此:

public E pop(){
    return s.remove(size--);
}

这就是错误。