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

10-12 20:32