Java 泛型列表中的NullPointerException
我已经在stackoverflow上搜索了1000个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;
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*参数”,我不知道如何使它工作,请问另一个问题。你会得到比在这里发表评论更多的支持。