java - 我的数据库应用程序的方法 getValueAt() 返回 "java.lang.IllegalArgumentException: Cannot format given Object as a Number"。为什么?

标签 java swing jdbc

我已经使用 ResultSet 通过(JTextLabels 编辑:JTextFields)向我的嵌入式 JDBC 数据库接受了各种类型的数据输入(整数、 double 、字符串和日期),并且我在 swing JTable 中显示结果使用我的自定义 AbstractTableModel。以下是我认为问题可能出在哪里的代码片段,但我不确定;

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() 方法周围的某个地方,它生成了以下异常,但即使是堆栈跟踪也没有将我指向代码的任何部分;

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*
............

我不知道为什么。

最佳答案

堆栈跟踪表明问题出在表格的渲染器中。 JTable 已决定它将为该特定值使用 DoubleRenderer,并且该值不能解析为 Double。我建议检查你的 TableModel#getColumnClass实现并查看它是否为实际上不包含 Double 的列返回 Double.class,因为这是用于确定要使用哪个渲染器的方法。

这可以在 source code 中看到对于 JTable,更具体地说是在 getRenderer 方法的源代码中。相关部分见下文(我链接到的源代码中的第 3454 行)

 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;

关于java - 我的数据库应用程序的方法 getValueAt() 返回 "java.lang.IllegalArgumentException: Cannot format given Object as a Number"。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8719735/

相关文章:

java - 在 JDBC 准备语句中使用变量而不是参数索引

Java ISBN 格式

java - 在 spring 中将 Path 变量绑定(bind)到自定义模型对象

java - 如何更改 netbeans 中不可编辑/生成的代码

java - 如何在JComponent中绘制JComponent?

Java MySQL 连接未关闭

java - 如何在 java 中的 Web 请求退出点运行代码

java - Javafx 中有 RSyntaxTextArea 的替代品吗?

Java框架问题

stored-procedures - 如何从 Java 中的 Oracle SP 返回 sys_refcursor?