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

Gui*_*ume 3 java swing jtable nullpointerexception

我在JTable(JDK 1.5_22)中遇到了一个奇怪的行为:
在表中选择更改并且在某些未知的特定情况下,JTable将使用'null'为value参数调用单元格渲染器.
这最终将在自定义渲染器代码上导致一个不错的"空指针异常",而这些代码还没有为这种粗鲁的调用做好准备.

这是有罪的方法(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));
            }
        }
Run Code Online (Sandbox Code Playgroud)

这里是关注错误的陈述:

Component component = renderer.getTableCellRendererComponent(
                                  JTable.this, null, false, false,
                                  row, column);
Run Code Online (Sandbox Code Playgroud)

问谷歌蒙特"JTable getAccessibleChild 5334"很有意思:我并不是唯一一个遇到这个"功能"的人.但没有答案.

最完美的问题是在官方太阳论坛上.

有没有人对此有所了解?

Dev*_*ler 5

这不是同步或EDT问题.代码中JTable显式调用getTableCellRendererComponentnull值.

返回的值从未使用过,因此,从表面上看,它看起来像旧的调试代码.但是我怀疑它是否存在不会破坏期望getTableCellRendererComponent在访问单元格之前调用的代码.

Sun之前已经调用过这个问题,他们的回答是API不保证value非null,因此getTableCellRendererComponent在使用null调用时必须优雅地失败.