Ich brauche ein frisches Blick auf mein Code

taik84

Mitglied
Hallo Tutorials-Fans

Ich habe folgendes Problem mit meinem JTable/TableModel/List-/ListElem.

Ich sitzte schon 2 Tage an einem Fehler und finde einfach keine Lösung. Vielleicht übersehe ich ihn ständig, was sehr peinlich gewesen wäre. Ich würde mich trotzdem freuen, wenn mir jemand helfen könnte.

Zuerst Code-Auszüge, die relevant sind:
Hauptprogramm(hier trifft der Fehler ungefähr in den Zeilen gekennzeichnet *):
Code:
Kliste liste = new Kliste();
MyTableModel mod = new MyTableModel(liste,columnNames);
JTable tab = new JTable(mod);
JScrollPane overview = new JScrollPane(tab);
public void fullTable(){
    String k = (String)k_choice.getSelectedItem();
    String d = (String)d_choice.getSelectedItem();
    liste.fillList(k,d);  *
    tab.updateUI();   *
}
Abstract MyTableModel(hier rifft der Fehler in den Zeilen gekennzeichnet mit *):
Code:
public Object getValueAt(int row, int col) {
    Kftrag help = data.goToPosition(row); *
    switch (col) {
      case 0:   return help.getName();          //String
      case 1:   return help.getIdent();         //String
      ....
      default:  return null;
    }
}
Kliste(folglich ist hier der fehler irgendwo in goToPosition und wahrscheinlich in removeAll):
Code:
public Kftrag first;
public Kftrag last;
public Kftrag pos;
public int length;
  
public Kliste(){
    first = null;
    last = first;
    pos = first;
    length = 0;
}
public void fillList(String knt,String dpt){
    removeAll();
    try{
      /*SQL Abfrage*/
      /*SQL Antwort Auswertung*/  
          addNew(a,wk,stu,wa,de,gb/stu,dg,ak,gb-ak*stu,100.0);
        }
     /*close und Fehlerabfang*/
    
}
public Kftrag goToPosition(int p){
    if (pos.getPosition()<p) {
      while(pos.getPosition()!=p){
        pos = pos.next;
      }
    }
    else if (pos.getPosition()>p){
      while(pos.getPosition()!=p){
        pos = pos.prev;
      }
    }
    return pos;
}
public void addNew(...){
    Kftrag k = new Kftrag(...);
    addAtEnd(k);
}
public void addAtEnd(Kftrag ka){
    if (first==null){
      first = ka;
      last = ka;
      ka.setPosition(0);
    }
    else {
      ka.prev = last;
      last.next = ka;
      last = ka;
      ka.setPosition(length);
    }
    length++;
}
public void removeAll(){
    first = null;
    last = first;
    length = 0;
}

Und hier ist endlich der Fehler:
Code:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
 at Kliste.goToPosition(Kliste.java:95)
 at MyTableModel.getValueAt(MyTableModel.java:46)
 at javax.swing.JTable.getValueAt(Unknown Source)
 at javax.swing.JTable.prepareRenderer(Unknown Source)
 at javax.swing.plaf.basic.BasicTableUI.paintCell(Unknown Source)
 at javax.swing.plaf.basic.BasicTableUI.paintCells(Unknown Source)
 at javax.swing.plaf.basic.BasicTableUI.paint(Unknown Source)
 at javax.swing.plaf.ComponentUI.update(Unknown Source)
 at javax.swing.JComponent.paintComponent(Unknown Source)
 at javax.swing.JComponent.paint(Unknown Source)
 at javax.swing.JComponent.paintWithOffscreenBuffer(Unknown Source)
 at javax.swing.JComponent.paintDoubleBuffered(Unknown Source)
 at javax.swing.JComponent._paintImmediately(Unknown Source)
 at javax.swing.JComponent.paintImmediately(Unknown Source)
 at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
 at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(Unknown Source)
 at java.awt.event.InvocationEvent.dispatch(Unknown Source)
 at java.awt.EventQueue.dispatchEvent(Unknown Source)
 at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)
 at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
 at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
 at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
 at java.awt.EventDispatchThread.run(Unknown Source)

Danke für die Hilfe im Voraus.

Gruß

Taik
 
Zuletzt bearbeitet:
Tag,
nun, da die NPE in gotoPosition() auftritt und Du dort mit dem pos-Objekt arbeiten willst, wird dieses noch NULL sein. Deshalb dürfte es nichts mit dem removeAll zu tun haben.
Mögliche Ursache: Das gotoPosition wird eher aufgerufen, bevor die SQL-Abfrage Daten geliefert und das pos gefüllt hat.
 
Du kannst auch gerne die SQLAbfrage haben, aber da finde ich auch nichts, was auf die lere Liste verweisen könnte:
Code:
public void fillList(String konto,String depot){
    removeAll();
    try{
      Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
      Connection con = DriverManager.getConnection("jdbc:odbc:Driver={MicroSoft Access Driver (*.mdb)};DBQ=C:/mpr/prj/pro/code/db.mdb","Administrator","");
      Statement st = con.createStatement();
      ResultSet rs = st.executeQuery("SELECT IdentNummer FROM Konto WHERE Kontonummer='" + konto + "' AND Depotnummer='" + depot + "'");
      while (rs.next()) {
        String id = Integer.toString(rs.getInt(1));
        Statement s = con.createStatement();
        ResultSet in = s.executeQuery("SELECT Aktie.AktienIdent,Belastung.GesamtBelastung,Belastung.Aktienkurs,Belastung.Stueckzahl,Waehrungskurs.Waehrung,Waehrungskurs.Waehrungskurs,Datum.Datum FROM Aktie,Belastung,Waehrungskurs,Datum WHERE Aktie.IdentNummer=" + id+" AND Belastung.IdentNummer=" + id+" AND Waehrungskurs.IdentNummer=" + id+" AND Datum.IdentNummer=" + id);
        while(in.next()){
          String a=null,wk=null,wa=null;
          int stu=0;
          Double de=0.0,ak=0.0,gb=0.0;
          java.util.Date da;

          wk = (String)in.getString(1);
          Statement sn = con.createStatement();
          ResultSet na = sn.executeQuery("SELECT Name FROM Ident WHERE WKN='"+wk+"' OR Namenskuerzel='"+wk+"'");
          while(na.next()){a = (String)na.getString(1);}
          sn.close();
          gb = (Double)in.getDouble(2);
          ak = (Double)in.getDouble(3);
          stu = (Integer)in.getInt(4);
          wa = (String)in.getString(5);
          de = (Double)in.getDouble(6);
          da = in.getDate(7);
          GregorianCalendar dg = new GregorianCalendar();
          dg.setGregorianChange(da);
          addNew(a,wk,stu,wa,de,gb/stu,dg,ak,gb-ak*stu,100.0);
        }
        s.close();
      }
      st.close();
      con.close();
    }
    catch (SQLException e1)  { e1.printStackTrace(); }
    catch (ClassNotFoundException e2)   { e2.printStackTrace(); }
}
 
Hilf mir mal auf die Sprünge: An welcher Stelle soll "pos" einen Wert ungleich NULL zugewiesen bekommen?
 

Neue Beiträge

Zurück