2015-10-02 1 views
0

Любая идея, что не так с этой линией? outStr[i]=(String) s.pop();Причина для java.lang.ArrayIndexOutOfBoundsException

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) 
+1

Вы не делаете 'size' больше, когда вы нажимаете, поэтому pop всегда пытается взять -1-ю вещь в стеке. Вместо того, чтобы содержать отдельную переменную 'size', почему бы просто не использовать' s.size() '? – azurefrog

+1

Прежде чем отвечать на все, я бы сказал вам доверять своей среде IDE. Желтая подчеркивание - это не украшение, это предупреждение: D Используете необработанные типы, где вы должны использовать генераторы – Dici

+2

Но теперь вы уменьшаете размер, прежде чем на самом деле появляетесь. Поэтому, если в стеке есть один элемент, вы задаете размер '0', а затем' s.remove (size-1) 'действительно' s.remove (-1) '... Поддержка« List »уже отслеживает его размера. Почему бы ему не доверять? – azurefrog

ответ

2

Некоторые неправильные вещи в этом коде:

  • вы используете сырые типы вместо генериков. Пусть компилятор поможет вам с (самой) ошибкой времени выполнения: Stack<String> stack = new Stack<>()

  • Stack.pop, вы никогда не проверяете, что у вас есть элемент для поп-музыки. Вы должны проверить его и выставить исключение, такое как NoSuchElementException, если стек пуст.

  • в Stack.pop, вы уменьшаете размер и удаляете товар size - 1, так что вы в основном уменьшаетесь дважды. Это должно быть: s.remove(--size);

+1

Спасибо за разъяснение на 's.remove (- size);' :) очень полезно –

1

Вы уменьшая размер переменной перед тем взять элемент из стек с использованием той же переменной размера. Поэтому, когда вы вызываете pop с одним элементом слева, вы уменьшаете размер до 0, а затем пытаетесь удалить элемент в позиции -1.

Зачем нужна переменная собственного размера, если у вас уже есть одна часть списка?

1

попытка изменить эту часть кода:

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

к этому:

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

вот ошибка.

 Смежные вопросы

  • Нет связанных вопросов^_^