首页 > 解决方案 > 尝试将行添加到 DefaultTableModel 模型时出现 Java 空指针异常

问题描述

我正在尝试使用来自文本字段的用户输入来查询数据库并将结果显示在 JTable 中。我可以在数据库中显示所有结果(不使用搜索)而不会出错,但是当使用文本搜索时,我得到空指针异常。

public static void loadServiceTable(JTable tblService,String searchData,String searchField){       
    try {
        //get tblItem model
        DefaultTableModel model=(DefaultTableModel) tblService.getModel();
        //remove all rows
        model.getDataVector().removeAllElements();
        System.out.println("Rows cleared");
        //create service array from services in DB according to search
        Service[] serviceArray=ServiceController.getAllService(searchData,searchField);
        //add one row each for service in array
        System.out.println("Service array success, length = "+serviceArray.length);
        for(Service s:serviceArray){
            model.addRow(new Object[]{
                s.getServiceID(),
                //error
                s.getName(),
                s.getDetail(),
                s.getPrice(),  
            });
        }
        tblService.repaint();
        System.out.println("Repaint finished");


    } catch (ClassNotFoundException ex) {
        Logger.getLogger(MainApp.class.getName()).log(Level.SEVERE, null, ex);
    } catch (SQLException ex) {
        Logger.getLogger(MainApp.class.getName()).log(Level.SEVERE, null, ex);
    }   
    }

/*(edited) This is the output.

"After getting table model
After getting service arr, arr length = 1
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at lk.ijse.ssc.view.MainApp.loadServiceTable(MainApp.java:2800)"*/

我正在使用以下方法显示所有数据(无需搜索)并且它可以正常工作。

public static void loadServiceTable(JTable tblService){       
    try {

        DefaultTableModel model=(DefaultTableModel) tblService.getModel();

        model.getDataVector().removeAllElements();

        Service[] serviceArray=ServiceController.getAllService();

        for(Service s:serviceArray){
            model.addRow(new Object[]{
                s.getServiceID(),
                s.getName(),
                s.getDetail(),
                s.getPrice(),


            });
        }
    } catch (ClassNotFoundException ex) {
        Logger.getLogger(MainApp.class.getName()).log(Level.SEVERE, null, ex);
    } catch (SQLException ex) {
        Logger.getLogger(MainApp.class.getName()).log(Level.SEVERE, null, ex);
    }   
}

getAllService(searchData,searchField) 方法如下所示。

public static Service[] getAllService(String searchData,String searchField) throws ClassNotFoundException, SQLException{
        //establish DB connection
        Connection con=DBConnection.getInstance().getConnection();
        //get no of services in DB and create array
        Service[] serviceArray=new Service[getRowCount(searchData,searchField)];
        //SQL statement to load matching services info from DB
        PreparedStatement pstm;


        if(searchField.equals("serviceID")) pstm=con.prepareStatement("SELECT service_id,name,detail,price FROM service WHERE service_id=?;");

        else pstm=con.prepareStatement("SELECT service_id,name,detail,price FROM service WHERE name=?;");

        pstm.setString(1,"%"+searchData+"%");
        ResultSet set=pstm.executeQuery();
        //create Item models for each record in DB and store them in Item array
        int index=0;
        while(set.next()){
            String serviceID=set.getString(1);
            String name=set.getString(2);
            String detail=set.getString(3);
            Double price=set.getDouble(4);

            serviceArray[index]=new Service(serviceID,name,detail,price);
            index++;

        }
        return serviceArray;
}

我对 Java 很陌生,这是我使用 Java Swing 和 MVC 架构的第三个程序。任何帮助深表感谢。

标签: javamysqlswingjtabledefaulttablemodel

解决方案


推荐阅读