gpt4 book ai didi

填充通用列表时出现 java.lang.NullPointerException

转载 作者:行者123 更新时间:2023-12-01 18:36:05 25 4
gpt4 key购买 nike

所以,我在学校用 Bluej 编程,我们的目标是使用通用列表以图形方式设计一个图鉴。我在设计界面时没有任何问题,但在填写列表时,我遇到了问题。

--列表(自制,所以我提供完整的内容,但重点关注老师告诉我们需要在其中的一些内容)--

import basis.*;
public class List<ContentType>
{
private Node<ContentType> head;
private Node<ContentType> tail;
private Node<ContentType> current;

private int Listlenght;

private boolean isEmpty;
private boolean hasAccess;

public List(){
head = null;
tail = null;
current = null;
}

public int Listlenght(){
int counter= 0;
toFirst();
while(hasAccess()){
next();
counter++;
}

return counter;
}

public boolean isEmpty(){
return head== null;
}

public boolean hasAccess(){
return current!=null;
}

public void next(){
if(isEmpty())
System.out.println("Liste ist leer");
else{
if(!hasAccess())
System.out.println("Kein momentanes Current");
else{
current= current.getNachfolger();
}
}

}

public void toFirst(){
if(isEmpty())
System.out.println("Liste ist leer");
else
current=head;
}

public void toLast(){
if(isEmpty())
System.out.println("Liste ist leer");
else
current=tail;
}

public Node<ContentType> getCurrent(){
if(hasAccess)
return current;

else{
System.out.println("Kein momentanes Current");
return null;
}
}

public void setCurrent(Node<ContentType> pCurrent){
if(hasAccess){
if(pCurrent!= null)
current.setInhalt(pCurrent.getInhalt());
}
else
System.out.println("Kein momentanes Current");

}


public void append(ContentType pContent){

if(pContent != null){

Node<ContentType> N;

N =new Node<ContentType>();
N.setNachfolger(null);
N.setInhalt(pContent);
if(isEmpty){
head =N;

}
else
tail.setNachfolger(N);

tail = N;
}
}

public void insert(ContentType pContent){
if(pContent != null){
if(hasAccess()){
Node<ContentType> N;

N =new Node<ContentType>();
N.setInhalt(pContent);
N.setNachfolger(current);
getPrevious(current).setNachfolger(N);

}
else
System.out.println("Kein momentanes Current");
if(isEmpty())
append(pContent);
}
else{
System.out.println("Kein Inhalt");

}
}

public void concat(List<ContentType> pList){
if (pList != this && pList != null && !pList.isEmpty()) {
pList.toFirst();
int i;
for(i=0;i< pList.Listlenght();i++){

//append(pList.getCurrent().getInhalt());
pList.next();

}
}
}

public void remove(){
if(hasAccess ){
getPrevious(current).setNachfolger(current.getNachfolger());
next();
}
}

private Node<ContentType> getPrevious(Node<ContentType> pNode) {
if (pNode != null && pNode != head && !this.isEmpty()) {
Node<ContentType> temp = head;
while (temp != null && temp.getNachfolger() != pNode) {
temp = temp.getNachfolger();
}
return temp;
} else {
return null;
}
}

}




import basis.*;
public class Node <ContentTypeN> {

private ContentTypeN inhalt;
private Node<ContentTypeN> Nachfolger;

public Node(){

Nachfolger = null;

}



public void setInhalt(ContentTypeN ninhalt){
this.inhalt= ninhalt;
}

public void setNachfolger(Node nNachfolger){
this.Nachfolger= nNachfolger;
}

public ContentTypeN getInhalt(){

return inhalt;
}

public Node<ContentTypeN> getNachfolger(){

return Nachfolger;
}

}

-- 我的对象类 --




import basis.*;
public class Pokemon{
private int Index;

private String Name;
private String Typ;


public Pokemon(int pIndex,String pName, String pTyp){
Index = pIndex;
Name = pName;
Typ = pTyp;



}

public int Index(int X){

return X;
}
}

主类

import basis.*;
public class Anwendung
{
private Fenster Window;
private Farbe Color;

private Maus mouse;

private List<Pokemon> Pokedex;

private TextFeld TFStatus;
private TextFeld TFName;
private TextFeld TFTyp;

private ZahlenFeld ZFNummer;

private Knopf Knext;
private Knopf KtoFirst;
private Knopf ktoLast;
public Anwendung(){


WindowDesign();

gottacatchthemall();
IhaveNoIdea();
}

public void IhaveNoIdea(){
Pokedex.toFirst();

Pokedex.getCurrent().getInhalt();


}
public void WindowDesign(){
Window= new Fenster(700,700);
//Window.setzeHintergrundFarbe(Color.GRUEN);
Window.setzeTitel("Pokedex");
Pokedex = new List<Pokemon>();
mouse = new Maus();

TFZFGeneration();
KnopfGeneration();

}

public void KnopfGeneration(){
Knext = new Knopf();
Knext.setzePosition(550, 300);
Knext.setzeText("next");

KtoFirst = new Knopf();
KtoFirst.setzePosition(550, 350);
KtoFirst.setzeText("toFirst");

ktoLast = new Knopf();
ktoLast.setzePosition(550, 400);
ktoLast.setzeText("toLast");
}

public void TFZFGeneration(){
TFStatus = new TextFeld();
TFStatus.setzeGroesse(120,20);
TFStatus.setzePosition(0,0);
TFStatus.setzeEditierbar(false);
TFStatus.setzeText("Methode");

TFName = new TextFeld();
TFName.setzeGroesse(120,20);
TFName.setzePosition(400,300);
TFName.setzeEditierbar(false);
TFName.setzeText("PokeName");

TFTyp = new TextFeld();
TFTyp.setzeGroesse(120,20);
TFTyp.setzePosition(400,350);
TFTyp.setzeEditierbar(false);
TFTyp.setzeText("PokeTyp");

}

public void gottacatchthemall(){
TFStatus.setzeText("gottacatchthemall");

Pokemon P;

P = new Pokemon(1,"Bisasam","Pflanze");
Pokedex.append(P);

P = new Pokemon(2,"Bisaknosp","Pflanze");
Pokedex.append(P);

P = new Pokemon(3,"Bisaflor","Pflanze");
Pokedex.append(P);

P = new Pokemon(4,"Glumanda","Pflanze");
Pokedex.append(P);

P = new Pokemon(5,"Glutexo","Feuer");
Pokedex.append(P);

P = new Pokemon(6,"Glurak","Feuer");
Pokedex.append(P);

P = new Pokemon(7,"Schiggy","Wasser");
Pokedex.append(P);

P = new Pokemon(8,"Schillok","Wasser");
Pokedex.append(P);

P = new Pokemon(9,"Turtok","Wasser");
Pokedex.append(P);

}
}

现在的问题是:每当我启动“Anwendung”类(class)时,都会发生错误。它说:

java.lang.NullPointerException
at List.append(List.java:100)
at Anwendung.gottacatchthemall(Anwendung.java:88)
at Anwendung.<init>(Anwendung.java:25)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
at bluej.runtime.ExecServer$3.lambda$run$1(ExecServer.java:834)
at bluej.runtime.ExecServer.runOnTargetThread(ExecServer.java:930)
at bluej.runtime.ExecServer$3.run(ExecServer.java:832)


这条线显然有问题

}
else
tail.setNachfolger(N);


看起来尾部是未定义的,即使它在下面几行被定义,并且这一行不是 Activity 的,因为当列表为空时,有一个 if 条件阻止 else 条件消失。该列表一开始是空的,我检查过。当我删除此代码时,列表似乎根本没有被填充,因为方法 goFirst 根本不起作用。

The Interface有什么建议么?我有点卡住了,我的老师也无法向我解释,所以如果我有点不具体,我很抱歉。

最佳答案

你说“尾部似乎未定义,尽管它在下面几行被定义了” - 你这是什么意思?在 Java 中,您必须首先分配值 - “上面几行”。

if(isEmpty){
head =N;
}
else
tail.setNachfolger(N); // Use brackets

tail = N;

在上面的代码中,您似乎试图在初始化 tail 之前调用 tail.setNachfolger(N),因此 tail 为 null,因此出现 NullPointerException。

此外,请始终使用括号(靠近“else”),因为现在尚不清楚您的意图。

很难理解你的代码,但我认为应该是:

else {
tail = N;
tail.setNachfolger(N);
}

关于填充通用列表时出现 java.lang.NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60040955/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com