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

时间:2014-11-29 01:57:55

标签: java

简单链接列表

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;
            }
        }
    }

#The class class#

  

我添加了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个元素?
为什么它会忽略第二个添加元素?

2 个答案:

答案 0 :(得分:1)

要=此;这句话对变量'last'没有影响,因为veriable'to'是形式参数,而变量'last'是实际参数。所以,当你执行这句话“to = this;”的价值 变量'last'没有改变为next。这意味着变量'last'始终指向第一个元素。

我的变化是:新条目(el,last); - > last = new Entry(el,last); 事情看起来更好。

答案 1 :(得分:0)

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

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

第一次打电话给我的是什么?

  • temp获取first指向的任何内容
  • first已移至下一个元素( RED FLAG
  • temp的数据会被返回......

一个问题是你正在移动你的头部参考 - 这是一个坏主意,因为这意味着你再也无法访问列表中真正的第一个元素。 / p>

现在,即使有了这个实现,你仍然可以获得第一个元素。

上面只是一个红色的鲱鱼 - 虽然你应该移动你的头指针。这是真正的问题。后续add来电列表会发生什么?

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

仅插入第一个元素并插入最后一个元素。 <{1}}之后的所有其他条目都将被覆盖。

我建议您使用调试器来解决这个问题,因为它源于对这样做的好方法的误解。一旦你有一个元素,你只想通过你的尾指针插入东西。通过对象创建来实现这一点只会引起心痛和混乱。

对于子孙后代,我将给你留下一个示例,逐字实现我为一段时间做的单链表实现而写的。它描述了一种更可行的插入列表的方法。

next