Finde den Grund für Null Pointer Exception nicht...

Collinwood

Mitglied
Hi, kann mir jemand sagen, wo hier (original in Zeile 174, hier 41) der Grund für die NPE ist?

Code:
/**
	 * @Description Fill the table with Content from The WatchList. Old content gets deleted.
	 */
	public void fillTable(){
		
		if(table != null){
			table.removeAll();
			table.setRedraw(true);
		}
		for(Article article : this.watchList){
			Merchant lowestPriceMerchant=null;
			for (Merchant merchant : article.getMerchantList()) {
				if(lowestPriceMerchant==null){
					lowestPriceMerchant=merchant;
				}
				int position=merchant.getPriceObjectList().size()-1;
				PriceObject priceObject = merchant.getPriceObjectList().get(position);
				
				int position2=lowestPriceMerchant.getPriceObjectList().size()-1;
				PriceObject lowestPriceObject = lowestPriceMerchant.getPriceObjectList().get(position2);
	
				if(priceObject.getPrice()<lowestPriceObject.getPrice()){
					lowestPriceMerchant=merchant;
				}
			}
				
			TableItem tableItem = new TableItem(table, SWT.NONE);

			if(article.getAmazonAsin() != null)  {
				tableItem.setText(0,article.getAmazonAsin());
			}
			if(article.getArticleNumber() != null)  {
				tableItem.setText(1,article.getArticleNumber());
			}
			if(article.getAmazonModelNumber() != null)  {
				tableItem.setText(2,article.getAmazonModelNumber());
			}
			if(article.getGrossBestPrice() > 0.0)  {
				tableItem.setText(3,article.getGrossBestPrice()+"");
			}
			int position=lowestPriceMerchant.getPriceObjectList().size()-1;
			PriceObject priceObject = lowestPriceMerchant.getPriceObjectList().get(position);
			
			tableItem.setText(4,priceObject.getPrice()+"");
			
			tableItem.setText(5,priceObject.getDate()+"");
			
			if(lowestPriceMerchant.getMerchantId() != null)  {
				tableItem.setText(6,lowestPriceMerchant.getMerchantId());
			}
			
			if(article.getDescription() != null)  {
				tableItem.setText(7,article.getDescription());
			}
		}
	}

Es geht darum, nach einem Prozessablauf aus einem anderen Thread (syncExec, mit synchronized getDisplay-Zugriff) eine Tabelle zeichnen zu lassen, bei der folgender Stacktrace vorliegt und das Programm die Grätsche macht, siehe pic im Anhang.

PS.: Wir haben uns schon saumäßig Gedanken gemacht, ob es wirklich am Threading liegen könnte, aber da fällt uns bald nichts mehr ein. Das Geschehen um den UI-Thread bei SWT mit syncExec und ThreadSafe-Methoden ist uns weithin bekannt.
 

Anhänge

  • stacktrace.JPG
    stacktrace.JPG
    107,8 KB · Aufrufe: 91
Huhu,

Schon einmal mit einem Debugger drübergefahren und nachgesehen ob alle Variablen initialisiert (und nicht null) sind?

Also, an den Stellen wo es absemmelt Breakpoints setzen und los geht's!
Die Offenbarung kommt dann meist innerhalb weniger Sekunden.

Gruß,
Martin
 
Sollte es wirklich die Zeile 41 sein, so gibt es nur zwei Möglichkeiten:
1. Die Variable lowestPriceMerchant ist null
2. Die Methode getPriceObjectList() des Objektes der Variable lowestPriceMerchant gibt null zurück

Den zweiten Fall kann man in deinem Code nicht überprüfen bzw. nachvollziehen, da die erforderliche Klasse Merchant fehlt und man deshalb nicht nachvollziehen kann, was da genau passiert.
Der erste Fall allerdings kann sehr wohl zurückverfolgt und nachvollzogen werden. In der Zeile 11 deklarierst du eine Variable lowestPriceMerchant vom Typ Merchant und diese willst du später auch nutzen. Zuvor wird diese jedoch initialisiert, im Idealfall mit einem Objekt, das den niedrigsten Preis hat. Soweit sogut, nur was ist mit dem Fall, dass es keine Merchants gibt, sprich die Liste, die von der Methode getMerchantList() zurückgegeben wird, leer ist? In dem Fall würde die Variable lowestPriceMerchant nie initialisiert werden und die NullPointerException ist vorprogrammiert.

Ich gehe stark davon aus, dass der erste Fall zutrifft. In dem Fall solltest du vor der eigentlichen Arbeit mit der Variable lowestPriceMerchant diese auf null überprüfen oder dafür sorgen, dass du immer mindestens ein Objekt in der MerchantList hast (vielleicht ein Dummyobjekt?). Ich rate zu der Überprüfung.
 
Vielen Dank für eure Hilfe! Akeshihiro hatte Recht, es liegt wirklich daran dass wir tatsächlich Artikel haben, zu denen es keinen Händler und damit auch keinen Preis gibt. Gelöst haben wir es nun ganz einfach, siehe Code. Aber da wäre ich ohne eure Hilfe gewiss sehr viel später erst drauf gekommen.
Code:
if(lowestPriceMerchant!=null) {
				if(lowestPriceMerchant.getPriceObjectList()!=null) {
					int position=lowestPriceMerchant.getPriceObjectList().size()-1;
					PriceObject priceObject = lowestPriceMerchant.getPriceObjectList().get(position);
					
					tableItem.setText(4,priceObject.getPrice()+"");
					
					tableItem.setText(5,priceObject.getDate()+"");
				}
				
				if(lowestPriceMerchant.getMerchantId() != null)  {
					tableItem.setText(6,lowestPriceMerchant.getMerchantId());
				}
				
			}
			else {
				tableItem.setText(4,"Kein Preis");
				tableItem.setText(5,"kein Datum");
				tableItem.setText(6,"Kein Händler");
				
			}
 
Zurück