代码之家  ›  专栏  ›  技术社区  ›  Guillaume

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

  •  3
  • Guillaume  · 技术社区  · 16 年前

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

    问Google Whith“jtable getaccessiblechild 5334”很有趣:我不是唯一一个遇到这个“功能”的人。但没有答案。

    最有条理的问题是 on official sun forum .

    有人知道这一点吗?

    2 回复  |  直到 13 年前
        1
  •  5
  •   Devon_C_Miller    16 年前

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

    返回的值从未被使用过,因此从表面上看,它更像是旧的调试代码。不过,我怀疑它不会破坏预期的代码 GetTableCellrenderComponent 在访问单元格之前调用。

    Sun以前就被要求解决这个问题,他们的答案是API不能保证 value 是非空的,所以 GetTableCellrenderComponent 使用空值调用时必须优雅地失败。

        2
  •  0
  •   trashgod    16 年前

    每当我看到像这样无法解释的问题时,我都会怀疑同步是否不正确。例如,

    1)未在 event dispatch thread .

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

    在存在复杂的初始化、具有意外延迟的模型或不同的硬件时,冲突会更频繁地出现。可能还有一个bug,但这两点值得检查。