Метод getValueAt () моего приложения базы данных возвращает «java.lang.IllegalArgumentException: Невозможно отформатировать данный объект как число». Зачем? - PullRequest
2 голосов
/ 04 января 2012

Я принял различные типы входных данных (целочисленные, двойные, строковые и дату) в мою встроенную базу данных JDBC через ( JTextLabels EDIT: JTextFields), используя ResultSet, и я отображаю результаты в свинговом 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*
............

Не знаю почему.

Ответы [ 2 ]

2 голосов
/ 04 января 2012

Stacktrace указывает, что проблема находится в рендере таблицы.JTable решил, что будет использовать DoubleRenderer для этого конкретного значения, и это значение не может быть проанализировано до Double.Я бы посоветовал проверить вашу реализацию TableModel#getColumnClass и посмотреть, возвращает ли она Double.class для столбца, который на самом деле не содержит Double s, поскольку это метод, который используется для определения того, какой рендер использовать.

Это можно увидеть в исходном коде для 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;
0 голосов
/ 04 января 2012

Куда бы вы ни звонили java.text.DecimalFormat.format() посмотрите, что там передается. Что бы это ни было, класс DecimalFormat не справится.

Если вы не вызываете этот класс и метод напрямую, тогда пошаговый отладчик - ваш лучший друг. Установите break point на DecimalFormat.format() и используйте шаговый отладчик , чтобы увидеть, что передается в этом аргументе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...