Странное поведение JTable из метода getAccessibleChild (), приводящее к нулевому указателю в клиентском коде - PullRequest
3 голосов
/ 16 июня 2010

Я столкнулся со странным поведением из 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 с «JTable getAccessibleChild 5334» было интересно: я не один, чтобы столкнуться с этой «функцией». Но ответа не было.

Наиболее хорошо сформулированный вопрос находится на официальном солнечном форуме .

Кто-нибудь знает об этом?

Ответы [ 2 ]

5 голосов
/ 16 июня 2010

Это не проблема синхронизации или EDT.Код в JTable явно вызывает getTableCellRendererComponent с нулевым значением.

Возвращаемое значение никогда не используется, поэтому на первый взгляд оно выглядит как старый код отладки.Однако я подозреваю, что он не нарушает код, который ожидает вызова getTableCellRendererComponent до обращения к ячейке.

Ранее Sun уже вызывал эту проблему, и он ответил, что API не гарантирует1008 * не является нулевым, поэтому getTableCellRendererComponent должен корректно завершиться ошибкой при вызове с нулевым значением.

0 голосов
/ 16 июня 2010

Каждый раз, когда я вижу другие необъяснимые проблемы, подобные этой, я задаюсь вопросом о неправильной синхронизации.Например,

1) Не удалось создать компонент в потоке диспетчеризации событий .

2) Отключение модели компонента в другом потоке.* Нарушения проявляются чаще при наличии сложной инициализации, модели с неожиданной задержкой или другого оборудования.Также может быть ошибка, но эти два пункта стоит проверить.

...