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:
- implicit dereferencing in
for (foo foo : foocollection)
, here npe iffoocollection
null. - 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
Post a Comment