ClassCastException异常的未知源(JTable中)
-
13-09-2019 - |
题
我当前重构而显示不同类型的数据的多个一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)
解决方案
这是在BooleanRenderer
发生该错误是因为它期待其是从表的模型的值是类型Boolean
的,并试图投射到它(AKF的回答具有在那里发生的准确代码行)。
我的猜测是,它最初预计,该模型将返回Boolean
值定列,但在一个点它,而不是返回字符串。
因此,我会集中于正在使用什么型号为这个给定的表(它是一个自定义的模式?是不是在那里添加值给它的默认模式?),看看它可以得到一个字符串,而不是一个Boolean
的。
其他提示
也许表包含一个复选框(当列模型指出列包含布尔类型)和渲染器试图将内容转换为一个布尔值。但大概内容是只是字符串。该解决方案是改变数据表或创建自己的渲染器。
我认为这个问题来自于您的TableModel(jtable.getModel()) 它的地方,所述
(..)
public Class<?> getColumnClass(int column)
{
switch(column)
{
(...)
case XX: return Boolean.class;
}
}
但在此列模型中的值是一个字符串
public Object getValueAt(int row,int column)
{
(..)
switch(column)
{
(...)
case XX: return (a String);
}
}
要调试这个问题,你可能要考虑咬咬牙,把一个断点在JTable$BooleanRenderer.getTableCellRendererComponent()
上,使得投行
setSelected((value != null && ((Boolean)value).booleanValue()));
(来自JTable.java 1.288 06/11/15
)
和检查类型value
的。当你发现一个String
,你可以从你的模型识别出错的行和列。这将至少给你确定问题开始。
不好意思挖了一个老问题,但我遇到了这个问题,我自己和这个帖子在搜索过来了,这是我碰上了。
我有JUnits测试失败(实际上是抛出运行时异常),但我继续跑加上我的JTable /删除(在JUnit测试),它把GUI应用程序在一个糟糕的状态,我会看到ClassCastException异常上来完全一样克里斯说明。
所以,“修正”对我来说,以确保所有的单元测试吸引他们的异常,并返回程序的故障的而不是运行更多的单元测试。
我有同样的问题,并且原因是完全相同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
}
}
这里的问题是,为行不存在,一个字符串被返回,对于每一个列。但是我的一些列的具有类类型,布尔型,并且因此异常:
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;