Неизвестный источник ClassCastException (в JTables) - PullRequest
0 голосов
/ 11 июня 2009

В настоящее время я выполняю рефакторинг JTable, который отображает множество различных типов данных. Основная причина такого рефакторинга заключается в том, что есть несколько ClassCastExceptions (автор / друг, написавший код, не работает в перерыве), и я не могу найти, откуда они берутся. Из-за большой кодовой базы я не знаю, с чего начать. У кого-нибудь есть предложения? Я осознаю и приношу извинения за неоднозначность этого вопроса!

Я включил трассировку стека ниже. Спасибо !!

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Boolean
    at javax.swing.JTable$BooleanRenderer.getTableCellRendererComponent(Unknown Source)
    at javax.swing.JTable.prepareRenderer(Unknown Source)
    at javax.swing.plaf.basic.BasicTableUI.paintCell(Unknown Source)
    at javax.swing.plaf.basic.BasicTableUI.paintCells(Unknown Source)
    at javax.swing.plaf.basic.BasicTableUI.paint(Unknown Source)
    at javax.swing.plaf.ComponentUI.update(Unknown Source)
    at javax.swing.JComponent.paintComponent(Unknown Source)
    at javax.swing.JComponent.paint(Unknown Source)
    at javax.swing.JComponent.paintToOffscreen(Unknown Source)
    at javax.swing.BufferStrategyPaintManager.paint(Unknown Source)
    at javax.swing.RepaintManager.paint(Unknown Source)
    at javax.swing.JComponent._paintImmediately(Unknown Source)
    at javax.swing.JComponent.paintImmediately(Unknown Source)
    at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
    at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
    at javax.swing.RepaintManager.seqPaintDirtyRegions(Unknown Source)
    at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(Unknown Source)
    at java.awt.event.InvocationEvent.dispatch(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

Ответы [ 6 ]

3 голосов
/ 11 июня 2009

Эта ошибка, возникающая в BooleanRenderer, связана с тем, что она ожидает, что значение из модели таблицы относится к типу Boolean и пытается привести его к нему (ответ akf содержит точную строку кода, в которой он возникает ).

Я предполагаю, что первоначально предполагалось, что модель вернет Boolean значений для данного столбца, но в какой-то момент она возвращает строки. Поэтому я бы сконцентрировался на том, какая модель используется для данной таблицы (это пользовательская модель? Это модель по умолчанию, где она добавляет значения к ней?) И посмотрю, где она может получить строку вместо * 1006. *.

2 голосов
/ 11 июня 2009

Вероятно, таблица содержит флажок (когда модель столбца утверждает, что столбец содержит тип Boolean), и средство визуализации пытается преобразовать содержимое в логическое значение. Но, вероятно, содержимое просто строки. Решением является изменение данных в таблице или создание собственного средства визуализации.

1 голос
/ 11 июня 2009

Я думаю, что проблема связана с вашей TableModel (jtable.getModel ()) Это где-то сказано

(..)
public Class<?> getColumnClass(int column)
   {
   switch(column)
     {
   (...)
      case XX: return Boolean.class;
      }
   }

но значение в вашей модели в этом столбце - String

public Object getValueAt(int row,int column)
  {
  (..)
   switch(column)
     {
   (...)
      case XX: return (a String);
      }
  }
0 голосов
/ 11 марта 2014

У меня была та же проблема, и причина была именно такой, как указано Avrom. В моем случае getValueAt был реализован как:

@Override
synchronized public Object getValueAt(int row, int col) {
  if (row < m_rows.size()) {
    return m_rows.get(row).getValueAt(col);
  } 
  else 
  {
    return "";  // THIS IS THE BUG
  }
}

Проблема здесь в том, что если строка не существует, возвращается строка для каждого столбца. Однако некоторые из моих столбцов имеют тип класса Boolean и, следовательно, исключение:

java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Boolean
  at javax.swing.JTable$BooleanRenderer.getTableCellRendererComponent(JTable.java:5409)
  at javax.swing.JTable.prepareRenderer(JTable.java:5736)

Решение было просто изменить возвращаемое значение на:

return null;
0 голосов
/ 12 октября 2010

Извините, что выкопал старый вопрос, но я сам столкнулся с этой проблемой, и этот пост появился в поиске, и это то, с чем я столкнулся.

У меня были неудачные тесты JUnits (и фактически генерирующие исключения во время выполнения), но я продолжал запускать / удалять на моем JTable (в тесте JUnit), который переводил приложение с графическим интерфейсом в плохое состояние, и я видел появление ClassCastException точно так, как описал Крис.

Таким образом, «исправление» для меня состояло в том, чтобы все модульные тесты перехватывали свои исключения и возвращали ошибку вместо продолжения выполнения дополнительных модульных тестов.

0 голосов
/ 11 июня 2009

Чтобы устранить эту проблему, вы можете подумать о том, чтобы укусить пулю и поставить точку останова в JTable$BooleanRenderer.getTableCellRendererComponent() на линии, которая делает приведение

setSelected((value != null && ((Boolean)value).booleanValue()));

(из JTable.java 1.288 06/11/15)

и проверьте тип класса value. когда вы найдете String, вы можете определить ошибочный столбец и строку в вашей модели. Это, по крайней мере, даст вам возможность определить проблему.

...