来自getAccessibleChild()方法的JTable奇怪行为导致客户端代码中出现空指针

时间:2010-06-16 15:32:42

标签: java swing nullpointerexception jtable

我遇到了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

有没有人对此有所了解?

2 个答案:

答案 0 :(得分:5)

这不是同步或EDT问题。 JTable中的代码显式调用getTableCellRendererComponent为空值。

从不使用返回的值,因此,从表面上看,它看起来像旧的调试代码。但是我怀疑它是否存在中断代码,希望在访问单元格之前调用getTableCellRendererComponent

之前已经调用了Sun这个问题,他们的答案是API不保证value是非空的,所以getTableCellRendererComponent在使用null调用时必须正常失败。

答案 1 :(得分:0)

任何时候我都会看到像这样的莫名其妙的问题,我想知道不正确的同步。例如,

1)未能在event dispatch thread上构建组件。

2)在其他一些线程上改变组件的模型。

在存在复杂初始化,具有意外延迟的模型或不同硬件的情况下,违规更频繁地出现。可能还有一个错误,但这两点值得检查。