public class ItemMain{
private String type = null;
private ItemDetail details = new ItemDetail();
public String getType(){
return type;
}
public String getDetailsDescription(){
return details.getDescription();
}
public int getDetailsInfixId(){
return details.getInfix().getId();
}
}
public class ItemDetail{
private String description = null;
private InfixObject infix = new InfixObject();
public String getDescription(){
return description;
}
public InfixObject getInfix(){
return infix;
}
}
public class InfixObject{
private int id = 0;
public int getId(){
return id;
}
}
ich bekomme überall Daten zurück ausser bei getDetailsInfixId(), da wird eine NullPointerException geworfen. Warum funktioniert das so bei getDetailsDescription() aber bei getDetailsInfixId() nicht?
Das Objekt wird mit Daten gefüllt. Das sehe ich wenn ich es in ItemDetail auf der console ausgeben lasse.
Code:
public InfixObject getInfix(){
System.out.println(infix.getId());
return infix;
}
Bist du dir sicher, dass die NPE in der Methode getDetailsInfixId() geworfen wird?
Dein Code scheint mir soweit richtig zu sein.
Poste am Besten mal den gesamten StackTrace. Der Fehler wird wohl woanders liegen.
Danke fürs Anschauen, ja bin ich mir ziemlich sicher. Ich habe den code allerdings abgeschrieben, zur Vollständigkeit hier noch mal der kopierte, gekürzte weil der Klassenname sonst nicht ganz zum stacktrace passt:
Java:
publicclassItemDetailObject{privateString description =null;privateInfixObject infix_upgrade =newInfixObject();publicInfixObjectgetInfixUpgrade(){System.out.println(infix_upgrade.getId());//(zeile 292)return infix_upgrade;}}publicclassInfixObject{privateint id =0;publicintgetId(){return id;}}publicclassItemMainObject{privateString type =null;privateItemDetailObject details =newItemDetailObject();publicStringgetType(){return type;}publicStringgetDetailDescription(){return details.description;}publicintgetDetailInfixUpgradeId(){return details.getInfixUpgrade().getId();//(zeile 521)}}
und hier das stacktrace:
Java:
java.lang.NullPointerException
at gw2p.JSON$ItemDetailObject.getInfixUpgrade(JSON.java:292)
at gw2p.JSON$ItemMainObject.getDetailInfixUpgradeId(JSON.java:521)
at gw2p.SQLiteJDBC.fillItemMainObject(SQLiteJDBC.java:757)
at gw2p.DbHelper$Task.doInBackground(DbHelper.java:108)
at gw2p.DbHelper$Task.doInBackground(DbHelper.java:1)
at javax.swing.SwingWorker$1.call(UnknownSource)
at java.util.concurrent.FutureTask.run(UnknownSource)
at javax.swing.SwingWorker.run(UnknownSource)
at java.util.concurrent.ThreadPoolExecutor.runWorker(UnknownSource)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(UnknownSource)
at java.lang.Thread.run(UnknownSource)
Die Zeile 292 gibt die richtige ID auf der console aus. Also das Objekt existiert soweit ich das beurteilen kann. Wenn ich die Zeile auskommentiere dann wird der Fehler in Zeile 521 geworfen.
Die IDE ist Eclipse.
Ich denke nicht.
Es sind innere Klassen der JSON Klasse.
Aufgerufen werden die Methoden aus einer anderen Klasse:
Zeile 757 von SQLiteJDBC.fillItemMainObject:
Java:
int detailInfixUpgrdId = itemMainObject.getDetailInfixUpgradeId();
dort werden auch alle anderen Methoden wie
Java:
getDetailDescription()
an der selben Stelle aufgerufen und die funktionieren ja.
Meine JSON Klasse ruft Daten von einer URL ab und konvertiert die JSON Daten mittels Gson() in die entsprechenden Objekte. Die Werte für
Java:
getDetailInfixUpgradId()
sind allerdings untergeordnete Objekte in einem JSON Objekt. Aber da es die ID ja in der console richtig ausgibt, sind die Daten auch richtig in das entsprechende Objekt konvertiert worden.
In der eigenständigen SQLiteJDBC Klasse werden die Werte dann Variablen zugewiesen und in eine Datenbank geschrieben.
Wie ist der BB-Code für Inline code?
Das Problem ist gelöst. Der Fehler wurde erst im zweiten Durchlauf geworfen. Da war dann das Objekt InfixObject() selbst nicht mehr vorhanden und somit konnte auch kein ID Parameter vorhanden sein.
Wobei ich der Meinung war das der ID Parameter ja trotzdem deklariert und initialisiert wird und somit zumindest 0 enthalten sollte. Aber anscheinend legt Gson() das Objekt gar nicht erst an wenn das entsprechende Objekt nicht in den JSON Daten vorhanden ist.