Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取线程中的异常";“主要”;带有LinkedList的java.lang.NullPointerException_Java - Fatal编程技术网

获取线程中的异常";“主要”;带有LinkedList的java.lang.NullPointerException

获取线程中的异常";“主要”;带有LinkedList的java.lang.NullPointerException,java,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 ge

简单链表

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个。。。为什么?

我真的不明白为什么列表包含两个元素

为什么它会忽略第二个添加的元素?

想想你的
get
方法在做什么。你已经注意到了一些异常的行为

public String get() {
    Entry temp=first;
    first=first.next;
    return temp.data;
}
我第一次叫它是怎么回事

  • temp
    获取第一个
    指向的内容
  • 第一个
    移动到下一个元素(红旗
  • temp
    的数据被返回
一个问题是你正在移动你的头引用-这是一个坏主意,因为这意味着你再也不能访问列表中真正的第一个元素了

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

上面的内容只是转移视线-尽管你不应该移动你的头指针。这才是真正的问题。后续的
添加
调用会发生什么

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;
}
公共作废插入(E数据){
节点候选=新节点(数据);
if(head==null){
负责人=候选人;
尾=头;
}否则{
tail.setNext(候选者);
tail=tail.getNext();
}
尺寸=尺寸+1;
}

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

我的更改是:新条目(el,最后一个);-->last=新条目(el,last);
事情看起来好多了。

如果你想创建一个链表,你最好习惯看到NullPointerException。(你最好学习如何快速调试。)我需要解释我的问题…你有一个“空指针”,因为你使用的引用是
null
。异常堆栈将您指向发生这种情况的确切行,因此您只需检查该行并找出哪个引用是
null
,以及原因。这通常需要调试——要么使用调试器,要么插入
System.out.println
调用来转储问题语句中的值。即使是有经验的程序员也会在编写链表时遇到困难。在彻底调试代码之前获取多个NullPointerException是意料之中的。这里有一个提示:to=this
行没有意义。您需要说明条目构造函数中的
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;
}