在JAVA中实现AbstractTableModel时出现异常?

在JAVA中实现AbstractTableModel时出现异常?,java,jtable,tablemodel,Java,Jtable,Tablemodel,我实现了一个自定义表模型,如下所示: public class MyTableModel extends AbstractTableModel { ... ... @Override public Class getColumnClass(int c) { return getValueAt(0, c).getClass(); } ... ... } 当我显示具有上述TableModel的JTable时,我得到了上述方法引

我实现了一个自定义表模型,如下所示:

public class MyTableModel extends AbstractTableModel {
    ...
    ...
    @Override
    public Class getColumnClass(int c) {
        return getValueAt(0, c).getClass();
    }
    ...
    ...
}
当我显示具有上述TableModel的JTable时,我得到了上述方法引发的NullPointerException

我认为异常是由于数据库表中的一些空单元格造成的

如果异常是由于数据库表中的空单元格造成的,那么如何解决此问题

并非数据库中的每一列都必须具有某些值。有些列可以不包含任何内容。

也许:

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

我希望它能对您有所帮助。

一个问题是,为什么您会得到这些特定坐标的空值。 如果它是合法的,并且您不希望呈现任何特殊的内容,那么您需要做的是空检查并返回Object.class,例如:

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

这将确保使用默认渲染器,并且由于没有值,因此不会渲染任何内容

如果单元格可以包含空值,那么对空值调用getClass()肯定会得到NPE。当然,您可以检查null,但您真正的问题比这更微妙

TableModel接口指定应该返回“列中所有单元格值的最特定超类”。从外观上看,您可以为单个列返回任意数量的类类型,这实际上破坏了TableModel契约

通常,对于给定的一组表数据,列类型是静态的,这意味着除非基础表数据已更改,否则列的类不应更改。我认为有必要问一下为什么需要返回这样一个特定的值


如果您希望呈现特定于给定类类型的某些内容,最好是自己动手,并根据每个单元确定对象类型。从那里,您可以根据需要进行任何特定的渲染。

除了目前为止的答案之外:假设您的模型由
列表支持(如前一个问题中所建议的),如果在
表格模型
不包含行的情况下尝试渲染
表格
,您将看到
索引自动边界异常(即,
列表
为空)。这是一个令人讨厌的边缘情况(我意识到您正试图呈现一个
结果集
——您如何知道
结果集
不会为空?)


为了避免这种情况,你为什么不按照我最初的建议,从
ResultSetMetaData
中确定每一列的类别?

我发现你还没有看我昨天问你相关问题时给你的代码。这两种解决方案都解决了这个问题。你不阅读所有内容浪费了人们的时间,这真是令人讨厌您在过去的帖子中得到的建议。同样,这个问题在我的两个提供完整工作代码的建议中都得到了处理。有时我想知道为什么我要发布工作代码。@camickr:我检查了您发布的示例,您也没有使用ResultSetMetaData来确定列类;您通过在数据上迭代…除非我遗漏了什么?我给出了两个解决方案。一个简单的解决方案使用现有的DefaultTableModel,不需要自定义模型。代码处理空单元格和空模型。这种方法节省了创建自定义模型的时间。第二个解决方案更复杂,因为它需要使用“泛型”可以在许多不同情况下使用的自定义模型。在本例中,我使用了一个静态方法从ResultSet填充模型。在本例中,元数据用于确定列类。这两种解决方案都提供了动态添加/删除/更改模型的能力。在第一个示例中,我注意到您有子类JTable和重写的getColumnClass(int),然后使用JTable的getValueAt(int,int)进行迭代。这有点危险,因为您是根据视图而不是模型工作的。例如,如果对JTable进行不同的排序,则getColumnClass(int)可能会为同一列返回不同的结果。