【问题标题】:method getValueAt() of my database app returns "java.lang.IllegalArgumentException: Cannot format given Object as a Number". Why?我的数据库应用程序的 getValueAt() 方法返回“java.lang.IllegalArgumentException:无法将给定对象格式化为数字”。为什么?
【发布时间】:2012-02-01 22:24:16
【问题描述】:

我已使用 ResultSet 通过 (JTextLabels EDIT: JTextFields) 接受各种类型的数据输入(整数、双精度、字符串和日期)到我的嵌入式 JDBC 数据库,并且我在摇摆的 JTable 中显示结果使用我的自定义 AbstractTableModel。以下是我的代码中的 sn-ps,我认为问题可能出在哪里,但我不确定;

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

线程“AWT-EventQueue-0”中的异常 java.lang.IllegalArgumentException:无法将给定的对象格式化为数字 在 java.text.DecimalFormat.format(DecimalFormat.java:487) 在 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.getToolTipText(JTable.java:3328) ………… *其他省略了4个简洁* …………

我不知道为什么。

【问题讨论】:

  • 什么是JTextLabel?我在 Java 7 的 J2SE class listing 中看不到它。
  • Lolz...cldnt 帮助但在什么之后发表评论?(一年?)lmao!匆忙中出现令人讨厌的打字错误......我实际上是指JTextField,myBad!

标签: java swing jdbc


【解决方案1】:

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

这可以在JTablesource code 中看到,更具体地说,可以在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;

【讨论】:

  • @罗宾-谢谢。我想你是正确的。 &即使我早些时候找到了一个替代方案,我仍然会遵循您的建议,看看它是否会给我一个更好的实施方案。一旦有改善,我会尽快通知您。你真的很有帮助。
【解决方案2】:

无论你在哪里调用java.text.DecimalFormat.format(),看看那里传递了什么。不管它是什么,DecimalFormat 类都无法处理。

如果您不直接调用该类和方法,那么 步进调试器 是您最好的朋友。在DecimalFormat.format() 上设置break point 并使用step debugger查看传入的非法参数。

【讨论】:

  • @罗宾-谢谢。我想你是正确的。 &即使我早些时候找到了一个替代方案,我仍然会遵循您的建议,看看它是否会给我一个更好的实施方案。一旦有改善,我会尽快通知您。你真的很有帮助。
  • 是的。真的,我不是直接调用类方法。 Robin 给了我一些建议,我打算将这些建议与这个 step debugger thingy 一起使用。希望它会奏效。感谢您的提示!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多