首页 > 解决方案 > 更新记录时数组越界异常

问题描述

我创建了一个简单的地址簿程序,它允许用户添加和更新记录。通讯录上还有一个jtable,向用户显示通讯录中的所有记录。我最近添加了用户更新现有记录和表刷新的逻辑。但是,如果我然后单击更新的记录或 Jtable 中的任何记录以显示到 Jtext 字段中,我会收到一个数组超出范围错误。

从数据库中获取记录的代码

public void addTable() throws Exception {

    tableModel = new DefaultTableModel();
    xtable = new JTable(tableModel);
    tableModel.addColumn("ID");
    tableModel.addColumn("First Name");
    tableModel.addColumn("Surname");
    tableModel.addColumn("Address Line 1");
    tableModel.addColumn("Address Line 2");
    tableModel.addColumn("Address Line 3");
    tableModel.addColumn("City");
    tableModel.addColumn("Post Code");
    tableModel.addColumn("Email Address");
    tableModel.addColumn("Phone Number");
    
    db.connectDb();
    String outQuery = "SELECT * FROM Contacts";
    db.myFs = db.st.executeQuery(outQuery);
    
    while (db.myFs.next()) {
        String id = db.myFs.getString("ContactID");
        String fName = db.myFs.getString("FirstName");
        String sName = db.myFs.getString("Surname");
        String adOne = db.myFs.getString("AddressLineOne");
        String adTwo = db.myFs.getString("AddressLineTwo");
        String adThree = db.myFs.getString("AddressLineThree");
        String cCity = db.myFs.getString("City");
        String pCode = db.myFs.getString("PostCode");
        String eAddress = db.myFs.getString("EmailAddress");
        String eName = db.myFs.getString("PhoneNumber");
        tableModel.insertRow(0, new Object[] { id, fName,sName, adOne, adTwo, adThree, cCity,
                pCode, eAddress, eName });
    }
    db.st.close();
    db.con.close();
    
    pane = new JScrollPane(xtable);
    pane.setBounds(700, 100, 400, 100);
    panel.add(pane);
    

}

将记录显示到 JTextField 中的代码

public void fetchRec() {
    xtable.addMouseListener(new MouseAdapter() {
        public void mouseClicked(MouseEvent e){
            
        
            String col0 = (String) xtable.getValueAt(xtable.getSelectedRow(),0);
            String col1 = (String) xtable.getValueAt(xtable.getSelectedRow(),1);
            String col2 = (String) xtable.getValueAt(xtable.getSelectedRow(),2);
            String col3 = (String) xtable.getValueAt(xtable.getSelectedRow(),3);
            String col4 = (String) xtable.getValueAt(xtable.getSelectedRow(),4);
            String col5 = (String) xtable.getValueAt(xtable.getSelectedRow(),5);
            String col6 = (String) xtable.getValueAt(xtable.getSelectedRow(),6);
            String col7 = (String) xtable.getValueAt(xtable.getSelectedRow(),7);
            String col8 = (String) xtable.getValueAt(xtable.getSelectedRow(),8);
            String col9 = (String) xtable.getValueAt(xtable.getSelectedRow(),9);
        
            idLabelField.setText(col0);
            firstNameLabelField.setText(col1);
            surNameLabelField.setText(col2);
            addressLineOneField.setText(col3);
            addressLineTwoField.setText(col4);
            addressLineThreeField.setText(col5);
            cityField.setText(col6);
            postCodeField.setText(col7);
            emailAddressField.setText(col8);
            phoneNumberField.setText(col9); 
            
            }
    });
}

更新数据库中记录的代码

    public void updateButton() {
    updateButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent ae) {
            number = Integer.parseInt(idLabelField.getText());
        
            setID(number);
            setFirstName(firstNameLabelField.getText());
            setSurName(surNameLabelField.getText());
            setAddressLineOne(addressLineOneField.getText());
            setAddressLineTwo(addressLineTwoField.getText());
            setAddressLineThree(addressLineThreeField.getText());
            setCity(cityField.getText());
            setPostCode(postCode.getText());
            setEmailAddress(emailAddressField.getText());
            setPhoneNumber(phoneNumberField.getText());

            try {
                db.updateDB(getID(),getFirstName(), getSurName(), getAddressLineOne(), getAddressLineTwo(),
                        getAddressLineThree(), getCity(), getPostCode(), getEmailAddress(), getPhoneNumber());
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            try {
                addTable();
                
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }                
            
        }
    });
}

我得到的错误是线程“AWT-EventQueue-0”中的异常 java.lang.ArrayIndexOutOfBoundsException: Index -1 out of bounds for length 8

标签: javaswingjdbcindexoutofboundsexception

解决方案


首先不要使用空布局和 setBounds()。Swing 被设计用于布局管理器。

我最近添加了用户更新现有记录和表刷新的逻辑。

我猜问题是您不断创建新组件(即 JTable 和 JScrollPane),然后将组件添加到屏幕上。

问题是您永远不会删除以前的组件,因此您在框架上绘制了每个组件的多个实例,并且您的变量不引用可见组件。

因此,解决方案是在您首次创建框架时创建JTableJScrollPane添加组件到框架中。然后,当您“引用”数据时,您只需创建一个新数据DefaultTableModel并使用该setModel(...)方法更新表。

或者您可以使用setRowCount(0)您的 currentDefaultTableModel删除所有当前数据,然后使用该addRow(...)方法使用 ResultSet 中的 dat 重新填充模型。


推荐阅读