Java 泛型列表中的NullPointerException

Java 泛型列表中的NullPointerException,java,nullpointerexception,generic-list,Java,Nullpointerexception,Generic List,我已经在stackoverflow上搜索了1000个NullPointerException帖子,我一辈子都不知道为什么会发生这种情况;除了显而易见的(它是空的)之外。有人能帮我理解是什么原因导致我出现这个运行时错误,而我对泛型单链接列表不了解 这是我的密码: import java.io.*; import java.util.*; public class GList<T> { private GNode<T> head;

我已经在stackoverflow上搜索了1000个NullPointerException帖子,我一辈子都不知道为什么会发生这种情况;除了显而易见的(它是空的)之外。有人能帮我理解是什么原因导致我出现这个运行时错误,而我对泛型单链接列表不了解

这是我的密码:

    import java.io.*;
    import java.util.*;

public class GList<T> {         
    private GNode<T> head;
    private GNode<T> cursor;

    private static class GNode<E>{
    private E data;        //NULLPOINTEREXCEPTION
    private GNode<E> next;

    public GNode(E data, GNode<E> next) {
        this.data = data;
        this.next = next;
    }
}                
public static class InnerList<E> {
    private String name;
    private GList<Integer> inner = new GList<Integer>();

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public GList<Integer> getInner() {
        return inner;
    }
    public void setInner(GList<Integer> inner) {
        this.inner = inner;
    }
}
public boolean hasNext(T cursor) {
    /*
     * returns whether or not the node pointed to by 'cursor' is
     * followed by another node. If 'head' IS null, returns False
     */
    if (cursor != null)
    {
        return true;
    }
    else
    {
        return false;
    }
}
public void insertFirst(T t) {
    /*
     * puts a new node containing t as a new first element of the list
     * and makes cursor point to this node
     */     
    if (hasNext(t) == false){
        head = new GNode<T>(t, head);
        head.next.data = t;
        cursor.next = head;
    }
    else{
        System.out.println("List is not null.");
    }
} 
public static void main(String[] args){

GList<InnerList> list = new GList<InnerList>();

String ln = "hello";
list.cursor.next.data.setName(ln);  //NULLPOINTEREXCEPTION

/*Exception in thread "main" java.lang.NullPointerException
 *at GList$GNode.access$0(GList.java:10)
 *at GList.main(GList.java:67) 
 */
}
}
import java.io.*;
导入java.util.*;
公共课英语{
私人侏儒头;
私有GNode游标;
私有静态类GNode{
私有E数据;//NULLPOINTEREXCEPTION
私有GNode next;
公共GNode(E数据,GNode下一个){
这个数据=数据;
this.next=next;
}
}                
公共静态类内部列表{
私有字符串名称;
private GList inner=新GList();
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
公共英语{
返回内部;
}
公共空间设置内部(GList内部){
this.inner=内部;
}
}
公共布尔hasNext(T游标){
/*
*返回“游标”指向的节点是否为
*后跟另一个节点。如果“head”为null,则返回False
*/
如果(光标!=null)
{
返回true;
}
其他的
{
返回false;
}
}
公共空间插入优先(T){
/*
*将包含t的新节点作为列表的第一个新元素
*并使光标指向该节点
*/     
if(hasNext(t)=false){
头部=新的GNode(t,头部);
head.next.data=t;
cursor.next=头部;
}
否则{
System.out.println(“列表不为空”);
}
} 
公共静态void main(字符串[]args){
GList list=新GList();
String ln=“hello”;
list.cursor.next.data.setName(ln);//NULLPOINTEREXCEPTION
/*线程“main”java.lang.NullPointerException中出现异常
*在GList$GNode.access$0(GList.java:10)
*在GList.main(GList.java:67)
*/
}
}

这是一个家庭作业,所以一个解释将是最有帮助的,因为我相信我将在接下来的几个月里处理LinkedList。

因为您使用的是默认构造函数,您还没有给出实现

GList<InnerList> list = new GList<InnerList>();
Java在此停止执行,但其他字段也为空。花点时间重新访问代码并初始化所有相关字段


事实上,您不应该尝试访问列表中的任何内容,因为您没有向其中添加任何项目。它的
光标
为空。

因为您使用的是默认构造函数,但尚未给出实现

GList<InnerList> list = new GList<InnerList>();
Java在此停止执行,但其他字段也为空。花点时间重新访问代码并初始化所有相关字段


事实上,您不应该尝试访问列表中的任何内容,因为您没有向其中添加任何项目。它的
光标
为空。

在这一行
列表.cursor.next.data.setName(ln)您正在尝试引用从未初始化过的对象的属性


在声明游标、下一步和数据时,不设置任何值。在main方法中,您从未设置head或cursor的值,因此它们仍然为null。然后您尝试引用它们并获取NPE。

在这一行
list.cursor.next.data.setName(ln)您正在尝试引用从未初始化过的对象的属性



在声明游标、下一步和数据时,不设置任何值。在main方法中,您从未设置head或cursor的值,因此它们仍然为null。然后你尝试引用它们并获得一个NPE。

也可以发布异常stacktrace。它位于底部。NPE可以在任何上下文中抛出。首先,你应该试着理解一般的原因是什么(看看JavaDocs)。哇,在main的第67行有很多点。NullPointerException告诉您,点之前的其中一个引用为null。如果您能够在调试模式IDE中运行程序,那么在该行上设置断点并查看空值是迄今为止最简单的方法。也可以发布异常stacktrace。它位于底部。NPE可以在任何上下文中抛出。首先,你应该试着理解一般的原因是什么(看看JavaDocs)。哇,在main的第67行有很多点。NullPointerException告诉您,点之前的其中一个引用为null。如果您能够在调试模式IDE中运行程序,那么在该行上设置断点并查看空值是迄今为止最简单的方法。我是否在main方法中初始化它?否。因为字段是私有的,您将无法从该类之外访问它们。您要做的是为您的
GList
类提供一个默认构造函数,并在那里进行所有字段初始化。谢谢!我将进一步讨论这个问题。我通过这样做解决了这个问题:GList list=new GList()。。。问题是作业需要GList列表;如果列表不能正确初始化,或者上面写着“不适用于for*参数”,我不知道如何使它工作,请问另一个问题。您将获得比在此处注释更多的支持。我是否在主方法中初始化它?否。因为字段是私有的,所以您将无法从该类之外访问它们。您要做的是为您的
GList
类提供一个默认构造函数,并在那里进行所有字段初始化。谢谢!我将进一步讨论这个问题。我通过这样做解决了这个问题:GList list=new GList()。。。问题是作业需要GList列表;如果列表不能正确初始化,或者上面写着“不适用于for*参数”,我不知道如何使它工作,请问另一个问题。你会得到比在这里发表评论更多的支持。