Java 链表堆栈将丢失堆栈上推送的最后一项

Java 链表堆栈将丢失堆栈上推送的最后一项,java,linked-list,stack,Java,Linked List,Stack,我正在研究一个堆栈的链表实现,似乎只有一个错误就得到了我需要的东西。我插入了3个字符串,但是在弹出第3个字符串之前,我得到了一个NullPointerException 在运行调试时,我发现这个缺少的值正在从这个列表中“弹出”,但它似乎没有被计数……这意味着它从堆栈中丢失,没有打印到控制台,并且该列表再进行一次迭代,在这个迭代点上抛出NullPointerException,因为最后一个值已经弹出。有人能告诉我如何将所有值打印到控制台上吗 以下是我的LinkedListStack类: publi

我正在研究一个堆栈的链表实现,似乎只有一个错误就得到了我需要的东西。我插入了3个字符串,但是在弹出第3个字符串之前,我得到了一个NullPointerException

在运行调试时,我发现这个缺少的值正在从这个列表中“弹出”,但它似乎没有被计数……这意味着它从堆栈中丢失,没有打印到控制台,并且该列表再进行一次迭代,在这个迭代点上抛出NullPointerException,因为最后一个值已经弹出。有人能告诉我如何将所有值打印到控制台上吗

以下是我的LinkedListStack类:

public class LinkedListStack <T>{  
private LinkedListStackNode<T> top;
public T data; 

class LinkedListStackNode<T> {        
    private T data;      //LINE 8
    private LinkedListStackNode<T> next; 

    public LinkedListStackNode(T data, LinkedListStackNode<T> next) {                       
        this.data = data;            
        this.next = next;
    }
}   
public void stack(){
    top = null;
}
public boolean isEmpty(){
    return top == null;
}
public void push (T t){
    top = new LinkedListStackNode<T> (t, top);
}
public T pop (){
    if (isEmpty()){
        System.out.println("The stack is empty!");
    }
    else{
        top = top.next;
    }
    return top.data; //Line 32
}
public T peek(){
    if (isEmpty()){
        System.out.println("Stack is Empty");
    }   
    return top.data;        
}  
}
公共类LinkedListStack{
私有LinkedListStackNode顶部;
公共数据;
类LinkedListStackNode{
私有T数据;//第8行
私有LinkedListStackNode下一步;
公共LinkedListStackNode(T数据,LinkedListStackNode下一个){
这个数据=数据;
this.next=next;
}
}   
公共空堆栈(){
top=null;
}
公共布尔值为空(){
返回top==null;
}
公共无效推送(T){
top=新的LinkedListStackNode(t,top);
}
公共T pop(){
if(isEmpty()){
System.out.println(“堆栈是空的!”);
}
否则{
top=top.next;
}
返回top.data;//第32行
}
公共T peek(){
if(isEmpty()){
System.out.println(“堆栈为空”);
}   
返回top.data;
}  
}
这是我的主要观点:

public类StacksAndQsMain{
公共静态void main(字符串[]args){
…截取代码进行压缩(不是此实现的一部分)。。。
//LinkedList实现
LinkedListStack lls=新LinkedListStack();
String s3=“今晚”//这不会打印,但会从堆栈中删除
String s4=“We Conqure”//打印很好
String s5=“Stacks”//打印效果良好
lls.推(s5);
lls.推(s4);
lls.push(s3);
而(!lls.isEmpty()){
System.out.println(lls.pop());//第32行
}
}
}

看起来您正在弹出顶部,然后在pop()方法中读取新顶部的值

应该是这样的:

public T pop (){
   if (isEmpty()){
       throw new RuntimeException("Stack is empty");
   }
   else{
       T ret = top.data;
       top = top.next;
       return ret;
   }
}
当你这么做的时候,你最好修正一下你的偷窥()


非常感谢你!ret是returnvalue的缩写,我几分钟前就想到了,谢谢你的帮助。我接受了你的建议,也加入了例外。
public T pop (){
   if (isEmpty()){
       throw new RuntimeException("Stack is empty");
   }
   else{
       T ret = top.data;
       top = top.next;
       return ret;
   }
}
public T peek(){
    if (isEmpty()) {
        throw new RuntimeException("Stack is empty");
    }   
    return top.data;        
}