Итак, я программирую с 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.