有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java中LinkedList处使用泛型的Null指针异常

    public class   List_manager<E> {
        Entry<E> first;
        Entry<E> last;
        public void add(E element) {
            Entry<E> e=new Entry(element,last);
            if (first==null) first=last;
        }
        public E get() {
            Entry<E> temp=first;
            first=first.next;
            return temp.data;
        }
        public boolean isEmpty() { return first==null; }


        private static class Entry<E> {
            Entry<E> next;
            E data;
            public Entry(E element,Entry<E> to) {
                data=element;
                next=to;
                to=this;
            }
        }
    }

//now the main class

正在尝试创建linkedlist

public class Main {
    public static void main(String[] args) {
        Point p1=new Point(0,0); // 
        Point p2=new Point(12,5);
        Point p3=new Point(43,12);
        List_manager<Point> l=new List_manager<Point>();
        l.add(p1);
        l.add(p2);
        l.add(p3);
        System.out.println(l.get()); // here is an error occurs
        System.out.println(l.get());
    }
}

// Point

简单一点

public class Point {
    double x; 
    double y;
    public Point(double x,double y) {
        this.x=x;
        this.y=y;
    }
    public String toString() {
        return "("+Double.toString(x) + " , " + Double.toString(y) + ")";
    }
}

共 (3) 个答案

  1. # 1 楼答案

    add方法中,您可以执行以下操作:

    if (first==null) first=last;
    

    但是last永远不会初始化。它总是null,因此first就是null

    当你调用get方法时,你应该:

    first=first.next;
    

    因为firstnull,所以你得到NullPointerException

    查看代码的这一部分:

    public Entry(E element,Entry<E> to) {
        data=element;
        next=to;
        to=this;
    }
    

    最后一句to = this没有任何作用。您并没有像预期的那样修改last

    编辑-

    您应该在add方法中更新last

    public void add(E element) {
        Entry<E> e = new Entry(element, null);
        if (last != null) { last.next = e; }
        last = e;
        if (first == null) first = last;
    }
    
  2. # 2 楼答案

    变量lastfirst从未初始化:

    Entry<E> first;
    Entry<E> last;
    

    因此,在get()方法中,您将在这一行捕获一个nullPointerException:

    first=first.next;
    
  3. # 3 楼答案

    最后一个是没有设定。它将始终为空。所以第一个总是空的。当你打电话过来时:

    public E get() {
       Entry<E> temp=first;
       first=first.next;
       return temp.data;
    }
    

    您正试图从空对象中获取下一个值