繁体   English   中英

使用LinkedList在线程“主” java.lang.NullPointerException中获取异常

[英]Get Exception in thread “main” java.lang.NullPointerException with LinkedList

简单链表

public class List_manager {
        Entry first;
        Entry last;
        public void add(String el) {
            if (isEmpty()) { first=new Entry(el); last=first; return; }
            new Entry(el,last);
        }

        public String get() {
            Entry temp=first;
            first=first.next;
            return temp.data;
        }

        public boolean isEmpty() {
            return first==null;
        }
        private class Entry {
            String data;
            Entry next;
            public Entry(String data,Entry to) {
                this.data=data;
                to.next=this;
                to=this;
            }
            public Entry(String data) {
                this.data=data;
            }
        }
    }

#主要班级#

我添加了3个元素,列表仅包含2个...为什么?

  public class Main {
        public static void main(String[] args) {
            List_manager l=new List_manager();
            l.add("1");
            l.add("2");
            l.add("3");
            System.out.println(l.get());
            System.out.println(l.get()); // Why here output: "3"??
            System.out.println(l.get()); // here is an error occurs
        }
    }

我真的不明白为什么列表包含2个元素?
为什么忽略第二个添加的元素?

到这个=; 这句话对变量“ last”没有影响,因为可验证的“ to”是形式参数,而变量“ last”是实际参数。 因此,当您执行此句子“ to = this;”时 的价值
变量'last'未更改为next。这意味着变量'last'始终指向第一个元素。

我的更改是:new Entry(el,last); ->最后=新条目(el,last); 情况看起来更好。

考虑一下您的get方法在做什么。 您已经注意到它的某些异常行为。

public String get() {
    Entry temp=first;
    first=first.next;
    return temp.data;
}

我第一次叫这个会怎样?

  • temp得到了first指向的东西
  • first移动到其下一个元素( RED FLAG
  • temp的数据已返回...

一个问题是您正在移动主要参考文献-这是一个坏主意 ,因为这意味着您永远无法再访问列表中真正的第一个元素。

现在,即使有了这种实现,您仍然应该能够获得第一个元素。

上面只是一个红色的鲱鱼-尽管您应该移动头指针。 这是真正的问题。 后续add呼叫到您的列表会怎样?

public void add(String el) {
    if (isEmpty()) {
        first = new Entry(el);
        last = first;
        return;
    }
    new Entry(el,last);
}

考虑插入的第一个元素和插入的最后一个元素。 next所有其他条目将被覆盖。

我建议您使用调试器来解决这一问题,因为它是对执行此操作的好方法的误解。 一旦拥有一个元素,您只想通过尾指针插入内容。 通过创建对象来执行此操作只会导致心痛和混乱。

为了后代,我将为您提供一个示例,逐字记录的实现,这是我为前一段时间做的单链表实现编写的。 它描述了一种更可行的插入列表的方法。

public void insert(E data) {
    Node<E> candidate = new Node<>(data);

    if(head == null) {
        head = candidate;
        tail = head;
    } else {
        tail.setNext(candidate);
        tail = tail.getNext();
    }
    size = size + 1;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM