我的数据库应用程序的getValueAt()方法返回;java.lang.IllegalArgumentException:无法将给定对象格式化为数字;。为什么?
我已经使用ResultSet通过(JTextLabels EDIT:JTextFields)接受了各种类型的数据输入(整数、双精度、字符串和日期)到我的嵌入式JDBC数据库,并且我正在使用我的自定义AbstractTableModel在swing JTable中显示结果。以下是我的代码片段,我认为问题可能在哪里,但我不确定我的数据库应用程序的getValueAt()方法返回;java.lang.IllegalArgumentException:无法将给定对象格式化为数字;。为什么?,java,swing,jdbc,Java,Swing,Jdbc,我已经使用ResultSet通过(JTextLabels EDIT:JTextFields)接受了各种类型的数据输入(整数、双精度、字符串和日期)到我的嵌入式JDBC数据库,并且我正在使用我的自定义AbstractTableModel在swing JTable中显示结果。以下是我的代码片段,我认为问题可能在哪里,但我不确定 public void connectToDB() { try { connection = DriverMa
public void connectToDB()
{
try
{
connection = DriverManager.getConnection(DBURL, DBUSERNAME, DBPASSWORD);
statement = connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
connectedToDB = true;
}
catch (SQLException sqlEx)
{
sqlEx.printStackTrace();
}
}
//Overrides AbstractTableModel's getValueAt() method
public Object getValueAt(int row, int column) throws IllegalStateException
{
connectToDB();
if (connectedToDB == false)
throw new IllegalStateException ("Not Connected To database");
else
{
try
{
if ( resultSet.next() == true )
{
resultSet.absolute( row + 1 );
return resultSet.getObject( column + 1 );
}
}
catch (SQLException sqlEx)
{
sqlEx.printStackTrace();
}
}
return "";// returns an empty string Object in case an error occurs above
}
看起来好像在getValueAt()方法周围,它会生成以下异常,但即使stacktrace也不会指向代码的任何部分
Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: Cannot format given Object as a Number
at java.text.DecimalFormat.format(DecimalFormat.java:487)
at java.text.Format.format(Format.java:140)
at javax.swing.JTable$DoubleRenderer.setValue(JTable.java:5315)
at javax.swing.table.DefaultTableCellRenderer.getTableCellRendererComponent(DefaultTableCellRenderer.java:223)
at javax.swing.JTable.prepareRenderer(JTable.java:5683)
at javax.swing.JTable.getToolTipText(JTable.java:3328)
............
*Others ommitted 4 brevity*
............
线程“AWT-EventQueue-0”java.lang.IllegalArgumentException中出现异常:无法将给定对象格式化为数字
位于java.text.DecimalFormat.format(DecimalFormat.java:487)
at java.text.Format.Format(Format.java:140)
位于javax.swing.JTable$DoubleRenderer.setValue(JTable.java:5315)
位于javax.swing.table.DefaultTableCellRenderer.getTableCellRendererComponent(DefaultTableCellRenderer.java:223)
在javax.swing.JTable.prepareRenderer(JTable.java:5683)
位于javax.swing.JTable.getToolTiptText(JTable.java:3328)
............
*其他人则认为这句话很简洁*
............
我不知道为什么。你在哪里调用
java.text.DecimalFormat.format()
看看那里传递了什么。不管它是什么,DecimalFormat
类都无法处理
如果您不直接调用该类和方法,那么步骤调试器是您最好的朋友。在
DecimalFormat.format()
上设置断点
,并使用步骤调试器查看传入的非法参数。堆栈跟踪指示问题位于表的呈现器中。JTable
已决定对该特定值使用DoubleRenderer
,该值无法解析为Double
。我建议检查您的实现,并查看它是否为实际上不包含Double
s的列返回Double.class
,因为这是用于确定要使用哪个渲染器的方法
这可以在forJTable
中看到,更具体地说是在getRenderer
方法的源代码中。参见下面的相关部分(我链接到的源代码中的第3454行)
什么是
JTextLabel
?我在J2SE for Java 7.Lolz中没有看到它。。。cldnt帮助但评论什么?(一年?)lmao!匆忙中犯了严重的打字错误。。。我实际上是指JTextField,myBad!@罗宾-谢谢。我认为你是对的尽管我早些时候找到了一个可供选择的方法,但我还是会按照你的建议去做,看看它是否能给我一个更好的实现。一旦情况好转,我会尽快通知你。你帮了大忙,是的。实际上,我并没有直接调用类方法。罗宾给了我一些建议,我打算和这个步骤一起使用。希望它能起作用。谢谢你的提示!@罗宾-谢谢。我认为你是对的尽管我早些时候找到了一个可供选择的方法,但我还是会按照你的建议去做,看看它是否能给我一个更好的实现。一旦情况好转,我会尽快通知你。你真的帮了大忙。
TableCellRenderer renderer = null;
if (columnModel.getColumnCount() > 0)
renderer = columnModel.getColumn(column).getCellRenderer();
if (renderer == null)
{
int mcolumn = convertColumnIndexToModel(column);
renderer = getDefaultRenderer(dataModel.getColumnClass(mcolumn));
}
return renderer;