Вопрос

Я реализовал пользовательскую табличную модель следующим образом:

public class MyTableModel extends AbstractTableModel {
    ...
    ...
    @Override
    public Class getColumnClass(int c) {
        return getValueAt(0, c).getClass();
    }
    ...
    ...
}

Я получаю исключение NullPointerException, вызванное вышеуказанным методом, когда я отображаю JTable, имеющий указанную выше TableModel.

Я думаю, что исключение связано с некоторыми пустыми ячейками в таблице базы данных.

Если исключение вызвано пустыми ячейками в таблице базы данных, то как обойти эту проблему?

Не обязательно, чтобы каждый столбец в базе данных имел какое-то значение.Некоторые столбцы могут ничего не содержать.

Это было полезно?

Решение

Если ячейки могут содержать пустые значения, то вызов getClass() для нулевого значения, безусловно, выдаст вам NPE.Конечно, вы можете проверить наличие null, но ваша реальная проблема более тонкая.

Интерфейс TableModel указывает, что getColumnClass(int) должен вернуться "наиболее специфичный суперкласс для всех значений ячеек в столбце". Судя по всему, вы могли бы возвращать любое количество типов классов для одного столбца, фактически нарушая контракт TableModel.

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

В случае, когда вы хотите отобразить что-то конкретное для данного типа класса, вам лучше создать свой собственный TableCellRenderer - разработчик таблиц, и определение типа объекта для каждой ячейки.Оттуда вы можете выполнять любой конкретный рендеринг по мере необходимости.

Другие советы

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

   public Class getColumnClass(int c) {
        Object o = getValueAt(0, c);
        if(o==null) return Object.class;
        return o.getClass()
    }

Это обеспечит использование рендерера по умолчанию, и, поскольку стоимость нет, ничего не будет отображаться.

Возможно:

public Class getColumnClass(int c) {
        return (getValueAt(0, c) == null ? Object.class : getValue(0, c).getClass());
  }

Надеюсь, это поможет вам.

В дополнение к ответам до сих пор: при условии, что ваша модель поддерживается List (Как предполагалось в вашем предыдущем вопросе) Вы увидите IndexOutOfBoundsException Если попытка отобразить JTable когда TableModel не содержит рядов (т.е. List пустой). Это неприятный случай (как я понимаю, вы пытаетесь отображать ResultSet - Откуда вы знаете ResultSet не будет пустым?).

Чтобы избежать этого, почему вы не сделали то, что я предложил изначально, и не определили класс каждого столбца из ResultSetMetaData?

ResultSetMetaData НЕ предоставляет никакой информации об этом классе.Он предоставляет типы данных, специфичные для базы данных, которые автоматически не сопоставляются классам Java (например, "cidr" или "int8" в мире PostgreSQL), поэтому это предложение (которое, кстати, не включало никакого исходного кода) на самом деле не полезно.

Кроме того, комментарий "Я думаю, важно спросить, почему вам нужно возвращать такое конкретное значение" Джейсона Николса показывает общую невежественность в отношении того, как класс JTable используется в реальном мире.

Я хотел бы найти решение этой проблемы, когда в таблицах нет строк, где я все еще могу узнать, что такое класс Java, который я должен использовать для отображения моих ячеек для всего столбца.Идея о том, что выходные данные могут изменяться, основана на еще большем невежестве в отношении баз данных - тип данных столбца указан в определении этого столбца, и независимо от того, каково его содержимое, тип данных не меняется в зависимости от того, в какой строке вы его просматриваете.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top