填充泛型列表时发生java.lang.NullPointerException

填充泛型列表时发生java.lang.NullPointerException,java,list,nullpointerexception,Java,List,Nullpointerexception,所以,我在学校用Bluej编程,我们的目标是使用一个通用列表以图形方式设计一个 Pokedex。我在设计界面方面没有问题,但是在填写列表时,我遇到了一个问题 --清单(自制的,所以我提供了完整的清单,但重点放在老师告诉我们需要的东西上)-- 主课 import basis.*; public class Anwendung { private Fenster Window; private Farbe Color; private Maus mouse; pr

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

--清单(自制的,所以我提供了完整的清单,但重点放在老师告诉我们需要的东西上)--

主课

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);

    }
}

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

有什么建议吗? 我有点卡住了,我的老师也不能给我解释,所以如果我有点不具体,我很抱歉。

你说“尾巴似乎没有定义,尽管它被定义了几行”——这是什么意思?在Java中,必须首先赋值——“上面的几行

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

另外,请务必使用括号(在“else”附近),因为现在不清楚您的意图是什么

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

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

当调用列表的构造函数时,设置
tail=null
。在尝试调用变量
tail
的方法之前,似乎从未将
节点
分配给该变量。我怀疑,当您将第一个节点添加到列表中时,您需要将其分配给
head
tail
变量,因为列表的head和tail将是同一个节点。



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);

    }
}

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);


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

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