我遇到了来自 JTable (JDK 1.5_22) 的奇怪行为:
在表中的选择更改之后以及在某些未知的特定情况下,JTable 将使用“null”作为值参数调用单元格渲染器。
这最终会在自定义渲染器代码上导致一个很好的“空指针异常”,该代码还没有准备好接受这种粗鲁的调用。
这是有罪的方法(JTable.java,第 5319 行):
public Accessible getAccessibleChild(int i) {
if (i < 0 || i >= getAccessibleChildrenCount()) {
return null;
} else {
// children increase across, and then down, for tables
// (arbitrary decision)
int column = getAccessibleColumnAtIndex(i);
int row = getAccessibleRowAtIndex(i);
TableColumn aColumn = getColumnModel().getColumn(column);
TableCellRenderer renderer = aColumn.getCellRenderer();
if (renderer == null) {
Class<?> columnClass = getColumnClass(column);
renderer = getDefaultRenderer(columnClass);
}
Component component = renderer.getTableCellRendererComponent(
JTable.this, null, false, false,
row, column);
return new AccessibleJTableCell(JTable.this, row, column,
getAccessibleIndexAt(row, column));
}
}
这是错误陈述的重点:
Component component = renderer.getTableCellRendererComponent(
JTable.this, null, false, false,
row, column);
向谷歌询问“JTable getAccessibleChild 5334”很有趣:我并不是唯一遇到这个“功能”的人。但没有答案。
最完善的问题位于 on official sun forum 。
有没有人有这方面的线索?
最佳答案
这不是同步或 EDT 问题。 JTable
中的代码使用空值显式调用 getTableCellRendererComponent
。
返回的值从未使用过,因此,从表面上看,它更像是旧的调试代码。但是我怀疑它不会破坏期望在访问单元格之前调用 getTableCellRendererComponent
的代码。
Sun 之前曾就这个问题进行过调用,他们的回答是 API 不保证 value
是非空的,因此在使用 null 调用时 getTableCellRendererComponent
必须正常失败。
关于java - 来自 getAccessibleChild() 方法的 JTable 奇怪行为导致客户端代码中的空指针,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3054775/