tutorials.de Buch-Aktion 05/2012
Like Tree2Danke
  • 1 Beitrag von mccae
  • 1 Beitrag von Akeshihiro
ERLEDIGT
JA
ANTWORTEN
3
ZUGRIFFE
504
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Collinwood Collinwood ist offline Mitglied Bronze
    Registriert seit
    Jul 2010
    Ort
    35789 Weilmünster (Hessen)
    Beiträge
    28
    Hi, kann mir jemand sagen, wo hier (original in Zeile 174, hier 41) der Grund für die NPE ist?

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    
    /**
         * @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.
    Miniaturansicht angehängter Grafiken Miniaturansicht angehängter Grafiken Finde den Grund für Null Pointer Exception nicht...-stacktrace.jpg  
     

  2. #2
    Avatar von mccae
    mccae mccae ist offline Senfdazugeber
    Registriert seit
    Dec 2007
    Ort
    Wien
    Beiträge
    226
    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
    Collinwood bedankt sich. 

  3. #3
    Avatar von Akeshihiro
    Akeshihiro Akeshihiro ist offline Mitglied Platin
    Registriert seit
    Aug 2008
    Ort
    Kirchlengern (NRW)
    Beiträge
    647
    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.
    Collinwood bedankt sich. 
    Man sagt, das Schwert eines Samurai sei seine Seele ...

    Mit den Beiträgen ist es wie mit Schwertern: Je besser die Rohstoffe sind und je öfter man diese bearbeitet, desto hochwertiger sind sie.

    Das Schmieden ist eine Kunst; Das Schreiben auch ;)

  4. #4
    Collinwood Collinwood ist offline Mitglied Bronze
    Registriert seit
    Jul 2010
    Ort
    35789 Weilmünster (Hessen)
    Beiträge
    28
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    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");
                    
                }
     

Ähnliche Themen

  1. [C] Pointer nach Funktionsaufruf nicht NULL
    Von trench140 im Forum C/C++
    Antworten: 2
    Letzter Beitrag: 04.07.09, 17:13
  2. Spielfeld mit JLabel Array, Null-Pointer-Exception beim Einfügen der JLabels
    Von lucas66 im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 2
    Letzter Beitrag: 13.06.07, 12:25
  3. Antworten: 2
    Letzter Beitrag: 17.07.06, 13:20
  4. Antworten: 4
    Letzter Beitrag: 09.05.05, 19:00
  5. Finde den Grund für Laufzeitfehler nicht
    Von sonotos im Forum C/C++
    Antworten: 1
    Letzter Beitrag: 02.11.04, 23:47

Stichworte