java - Why setTableHeader() method throws NullPointerException? -


i try add tooltips jtable header. in case use ttheader class extends jtableheader java class. seems fine, when try add new ttheader header jtable, nullpointerexception unknown source. don't know why. ttheader class seems ok. problem somewhere else.

here code approach. jtable populate:

 private jpanel contentpane;  private jscrollpane scrollpane;  private jtable table;  private string tooltipssdb[] = {"sessionid", "userid", "patientid", "pluginid", "date", "time"};   connection conn = null;  resultset rs = null;  preparedstatement ps = null;   table() {       // connection component       conn = connectionjdbc.connectdb();        settitle("my sample table");       setsize(new dimension(400, 400));       setdefaultcloseoperation(jframe.exit_on_close);       setlocationrelativeto(null);       setvisible(true);        contentpane = new jpanel();       contentpane.setlayout(new borderlayout(0, 0));       setcontentpane(contentpane);        scrollpane = new jscrollpane();       contentpane.add(scrollpane, borderlayout.center);        table = new jtable() {            public boolean iscelleditable(int row, int column) {                 return false;            };       };       table.setautocreaterowsorter(true);       // populate jtable data sql db       populatetable();       scrollpane.setviewportview(table);  }   public void populatetable() {       string sql = "select * " + exampledatabase + " order " + exampledata + " desc";       try {            // make connection db            ps = conn.preparestatement(sql);            rs = ps.executequery();            resultsetmetadata rsmetadata = rs.getmetadata();             // populate jtable            int columns = rsmetadata.getcolumncount();            defaulttablemodel dtm = new defaulttablemodel();            vector columns_name = new vector();            vector data_rows = new vector();            (int = 1; <= columns; i++) {                 columns_name.addelement(rsmetadata.getcolumnname(i));            }            dtm.setcolumnidentifiers(columns_name);            while (rs.next()) {                 data_rows = new vector();                 (int j = 1; j <= columns; j++) {                      data_rows.addelement(rs.getstring(j));                 }                 dtm.addrow(data_rows);            }            table.setmodel(dtm);             // create header jtable            ttheader tth = new ttheader(table.getcolumnmodel());            tth.settooltipstrings(tooltipssdb);            table.settableheader(tth); // on line nullpointerexception uknown source             table.repaint();       } catch (sqlexception e) {            joptionpane.showmessagedialog(null, "populate table error! \n" + e);        }   }   public static void main(string args[]) {       eventqueue.invokelater(new runnable() {            public void run() {                 try {                      new table();                 } catch (exception e) {                      joptionpane.showmessagedialog(null, e);                 }            }       });  } 

and ttheader class:

string[] tooltips;  public ttheader(tablecolumnmodel model) {     super(model); }  public string gettooltiptext(mouseevent e) {     int col = columnatpoint(e.getpoint());     int modelcol = gettable().convertcolumnindextomodel(col);     string retstr;     try {         retstr = tooltips[modelcol];     } catch (nullpointerexception ex) {         retstr = "";     } catch (arrayindexoutofboundsexception ex) {         retstr = "";     }     if (retstr.length() < 1) {         retstr = super.gettooltiptext(e);     }     return retstr; }  public void settooltipstrings(string[] tooltips) {     this.tooltips = tooltips; } 

npe appears when choose second database jcombobox. in jcombobox listener call populatetable() method. here more specific stacktrace:

exception in thread "awt-eventqueue-0" java.lang.nullpointerexception @ mypackage.ttheader.gettooltiptext(ttheader.java:19) @ javax.swing.tooltipmanager$insidetimeraction.actionperformed(unknown source) @ javax.swing.timer.fireactionperformed(unknown source) @ javax.swing.timer$dopostevent.run(unknown source) @ java.awt.event.invocationevent.dispatch(unknown source) @ java.awt.eventqueue.dispatcheventimpl(unknown source) @ java.awt.eventqueue.access$200(unknown source) @ java.awt.eventqueue$3.run(unknown source) @ java.awt.eventqueue$3.run(unknown source) @ java.security.accesscontroller.doprivileged(native method) @ java.security.protectiondomain$1.dointersectionprivilege(unknown source) @ java.awt.eventqueue.dispatchevent(unknown source) @ java.awt.eventdispatchthread.pumponeeventforfilters(unknown source) @ java.awt.eventdispatchthread.pumpeventsforfilter(unknown source) @ java.awt.eventdispatchthread.pumpeventsforhierarchy(unknown source) @ java.awt.eventdispatchthread.pumpevents(unknown source) @ java.awt.eventdispatchthread.pumpevents(unknown source) @ java.awt.eventdispatchthread.run(unknown source) 

line nr 19:

int modelcol = gettable().convertcolumnindextomodel(col); 

when npe , identified line, first thing check occurrences of dereferencing operator (.). value on left hand side(!) of such operator null. (if have multiple .s on 1 line, 1 of those. if line foo.getbar().dosomething(), either foo null or foo.getbar() returns null. dosomething() returns not matter.)

in case, gettable() method returns null.

since java 5 there have been 2 new, rather more sneaky possible causes of npe:

  1. implicit dereferencing in for (foo foo : foocollection), here npe if foocollection null.
  2. auto-unboxing of numbers: integer = null; int j = + 1; //npe here

that's need know debugging of npes in general, there's of course more general advice should either log variable values or use debugger execute code step-by-step.


Comments

Popular posts from this blog

c# - How Configure Devart dotConnect for SQLite Code First? -

c++ - Clear the memory after returning a vector in a function -

erlang - Saving a digraph to mnesia is hindered because of its side-effects -