java .lang.NullPointerException при заполнении универсального c списка - PullRequest
0 голосов
/ 03 февраля 2020

Итак, я программирую с Bluej в школе, и нашей целью было использовать обобщенный список c для графического дизайна Pokedex. У меня нет проблем при разработке интерфейса, но при заполнении списка у меня есть проблема.

- Список (самодельный, поэтому я предоставляю его целиком, но сосредоточился на некоторых вещах, которые, как сказал нам учитель, должны быть там) -

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", возникает ошибка. он говорит:

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, которое блокирует выполнение условия else, когда список пуст. список пуст в начале, я проверил это. Когда я удаляю этот код, кажется, что список не заполняется вообще, так как метод goFirst не работает вообще.

Интерфейс Есть предложения? Я немного застрял, и мой учитель тоже не смог мне это объяснить, так что извините, если я немного не определен c.

1 Ответ

0 голосов
/ 03 февраля 2020

Вы сказали, что " Кажется, что хвост не определен, даже если он определен на несколько строк вниз " - что вы подразумеваете под этим? В Java сначала необходимо присвоить значение - «несколько строк выше ».

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

tail = N; 

В приведенном выше коде кажется, что вы пытаетесь вызвать tail.setNachfolger(N) перед инициализацией tail, поэтому tail равен нулю, поэтому NullPointerException.

Кроме того, всегда используйте квадратные скобки (почти «еще»), потому что теперь неясно, что вы хотели.

Трудно понять ваш код, но я думаю, что это должно быть:

else {
    tail = N;
    tail.setNachfolger(N);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...