2017-02-07 11 views
0

Ниже всего лишь один маленький кусок моего кода. Я пытаюсь понять, почему, если я добавлю в строку кода, который закомментирован, он выдает исключение EmptyStackException. Мне нужно добавить элемент вверху oneStack в начало twoStack, если в строке есть два нулевых значения (сгенерировано путем вызова items.getNextItem()). Любое понимание того, почему это ломается? Или как я могу получить верхнее значение oneStack, чтобы также быть верхним значением twoStack в этот момент?Java Stack throwing EmptyStackException после нажатия

Я попытался поместить эту строку кода в if, присвоив переменную значение oneStack.peek(), но ничто из этого не помогло. Это почти как если бы одна прокомментированная строка опорожняла весь стек (??).

Основная точка: если в этой пронумерованной строке кода я обмениваю oneStack.peek() с любым другим значением, он работает нормально. Так почему же он не работает с oneStack.peek()?

oneStack.push(firstItem); 
twoStack.push(firstItem); 
nextItem = items.getNextItem(); 
oneStack.push(nextItem); 
twoStack.push(nextItem); 
while (!done) { 
     if (oneStack.peek() == null) { 
      oneStack.pop(); 
      oneStack.pop(); 
      twoStack.pop(); 
      twoStack.push(oneStack.peek()); // the commented out line below causes this line to throw an EmptyStackException if uncommented. 
      newItem = items.getNextItem(); 
      oneStack.push(nextItem); 
      if (oneStack.peek() == null) { 
       oneStack.pop(); 
       twoStack.pop(); 
       //twoStack.push(oneStack.peek()); // if I uncomment this it breaks, but this needs to happen for twoStack to be correct 
      } else { 
       twoStack.push(nextItem); 
      } 
     } else if (oneStack.peek() == targetItem) { 
      done = true; 
     } else { 
      nextItem = items.getNextItem(); 
      oneStack.push(nextItem); 
      twoStack.push(nextItem); 
     } 

Это так, что элементы генерируются:

item1, item2, item3, item4, Item5, NULL, NULL, item6, ст.7

В конце концов, это то, что слева от штабелей: oneStack: item1, item2, item6, ст.7

twoStack: item1, item2, item3, item4, Item5, item4, item6, ст.7 (item3 отсутствует)

twoStack должно быть: item1, item2, item3, item4, Item5, item4, item3, item6, ст.7

+1

вы выходите из oneStack дважды, затем вы заглядываете. Сколько элементов имеет этот стек? – efekctive

+0

@efekctive Мне нужно выскочить из oneStack дважды, чтобы удалить нулевое значение и элемент, который предшествует ему, чтобы начать с элемента до этого (извините за то, как это запутывает). В принципе, если генерируется нулевое значение, оно должно быть удалено из oneStack, и поэтому должен быть добавлен предыдущий элемент, а элемент до этого должен быть добавлен в twoStack. –

+0

Хорошо. но уверены ли вы в размере стека в этот момент? Из вашего кода это может быть пустым или нет. каков размер до толчков? – efekctive

ответ

0

Предположительно ваш стек пуст после выскакивают от последней вещью, то выглядывая бросает исключение, потому что в стеке ничего не осталось, чтобы заглянуть.

+0

Я понимаю это, но стек довольно заполнен, когда это происходит, поэтому мне не имеет смысла, почему он действует так, как будто он пуст ... добавление if, если вокруг него не помогло:/ –

1

Я рекомендую, прежде чем пытаться что-либо вытащить из стека или заглянуть, сначала проверьте, что он не пуст. По крайней мере, это предотвратило бы исключение.

+0

Но предотвратить исключение, не зная, почему это произошло, так же плохо. Это просто задерживает очередной сбой – efekctive

+0

Это не дает ответа на вопрос. Когда у вас будет достаточно [репутации] (http://stackoverflow.com/help/whats-reputation), вы сможете [прокомментировать любое сообщение] (http://stackoverflow.com/help/privileges/comment); вместо этого [предоставить ответы, которые не требуют разъяснений у аськи) (http://meta.stackexchange.com/questions/214173/why-do-need-50-reputation-to-comment-what-can- я-делать-вместо этого). - [Из обзора] (/ review/low-quality-posts/15124865) – Joseph

+0

@Joseph: Это кажется разумной причиной для меня. 'peek()' будет вызывать 'EmptyStackException', если в нем ничего нет. – Makoto

0

До цикла:

oneStack = item1, item1 (if item1 is in items) or item2 
twoStack = item1, item1 (if item1 is in items) or item2 let's assume item2 

Размер петли два входа.

первый, второй, третий, четвертый раз вокруг:

oneStack = item1, item2 item3 item4 item5 null 
twoStack = item1, item2 item3 item4 item5 null 

Пятое время

oneStack = item1, item2 item3 item4 
twoStack = item1, item2 item3 item4 item5 item4 

Шестой раз

oneStack = item1, item2 item3 item4 null 
twoStack = item1, item2 item3 item4 item5 item4 null 

Седьмой раз:

oneStack = item1, item2 item3 
twoStack = item1, item2 item3 item4 item5 item4 item3 

восьмой и девятый раз вокруг

oneStack = item1, item2 item3 item6 item7 
twoStack = item1, item2 item3 item4 item5 item4 item3 item6 item7 

Как вы можете видеть, что неясно, что содержание элементов находятся в начале.Я бы распечатал каждую консоль и все стеки после каждого раунда. Также распечатывайте содержимое стеков и элементов перед входом в цикл.