java - 具有初始化变量的 NPE

标签 java swing

<分区>

有人可以向我解释为什么我在 getRowCount() 方法中得到 NullPointerException 吗?该变量用一个空的 ArrayList 初始化...

public class BeschriftungssetTableModel extends DefaultTableModel {

    private static final long serialVersionUID = -4980235976337188354L;

    private List<BeschriftungssetBean> data = new ArrayList<>();


    public void setData(List<BeschriftungssetBean> data) {
        this.data = data;
    }

    @Override
    public int getColumnCount() {
        return 1;
    }

    @Override
    public int getRowCount() {
        return data.size();
    }

    @Override
    public Object getValueAt(int row, int column) {
        return data.get(row).getBezeichnung();
    }

    @Override
    public String getColumnName(int column) {
        return "Bezeichnung";
    }

    public static void main(String[] args) {
        BeschriftungssetTableModel beschriftungssetTableModel = new BeschriftungssetTableModel();
        beschriftungssetTableModel.getRowCount();
    }
}



public class BeschriftungssetBean {
    private String objId;
    private String bezeichnung;

    public String getBezeichnung() {
        return bezeichnung;
    }

    public void setBezeichnung(String bezeichnung) {
        this.bezeichnung = bezeichnung;
    }

    public String getObjId() {
        return objId;
    }

    public void setObjId(String objId) {
        this.objId = objId;
    }
}

Exception in thread "main" java.lang.NullPointerException
at ch.aaa.xxx.yyy.gruppen.plugin.anzeige.beschriftungseinstellungen.BeschriftungssetTableModel.getRowCount(BeschriftungssetTableModel.java:36)
at javax.swing.table.DefaultTableModel.setDataVector(DefaultTableModel.java:224)
at javax.swing.table.DefaultTableModel.<init>(DefaultTableModel.java:124)
at javax.swing.table.DefaultTableModel.<init>(DefaultTableModel.java:106)
at javax.swing.table.DefaultTableModel.<init>(DefaultTableModel.java:86)
at ch.aaa.xxx.yyy.gruppen.plugin.anzeige.beschriftungseinstellungen.BeschriftungssetTableModel.<init>(BeschriftungssetTableModel.java:18)
at ch.aaa.xxx.yyy.gruppen.plugin.anzeige.beschriftungseinstellungen.BeschriftungssetTableModel.main(BeschriftungssetTableModel.java:50)

最佳答案

DefaultTableModel 的构造函数在子类有机会初始化其内容之前调用 getRowCount,从而导致 NPE 与您的实现。这是基类的糟糕设计,因为从构造函数中调用可重写的方法被认为是一种糟糕的做法,但是,嘿,Swing API 有很多这样的 :)

比照。 What's wrong with overridable method calls in constructors?

关于java - 具有初始化变量的 NPE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51890153/

相关文章:

java - Spring 网络套接字 : message not published

java - 如何从 ear/war/jar 中读取文件?

java - 从 Java 将图像保存在 MySQL 中

Java如何制作多个按钮?

Java 弹出窗口在执行 Kettle 期间卡住

java - 单击 JList 中的项目时如何切换它们?

java - 用JSP获取当前页面节点

java - 递归快速供电方法

java - 检查图 block 是否在相机 View 中时出现性能问题 java swing

java - 使用 JCanvas 时获取 KeyPressed