java JDBC ArrayIndexOutOfBounds删除、更新时异常

java JDBC ArrayIndexOutOfBounds删除、更新时异常,java,sql-server,swing,jdbc,indexoutofboundsexception,Java,Sql Server,Swing,Jdbc,Indexoutofboundsexception,因此,我尝试创建一个JTable,它通过JBDC连接到SQLServer数据库,并具有插入、删除和编辑数据等功能。它可以很好地与插入,但更新,删除。你们能告诉我为什么我得到了ArrayIndexOutOfBoundsException:-1以及如何修复它吗。这是我的密码。这里的书是一个扩展JFRAME的类 public Book() { initComponents(); model.addColumn("ID"); model.addColumn("Name");

因此,我尝试创建一个JTable,它通过JBDC连接到SQLServer数据库,并具有插入、删除和编辑数据等功能。它可以很好地与插入,但更新,删除。你们能告诉我为什么我得到了
ArrayIndexOutOfBoundsException:-1
以及如何修复它吗。这是我的密码。这里的书是一个扩展JFRAME的类

public Book() {
    initComponents();

    model.addColumn("ID");
    model.addColumn("Name");
    model.addColumn("Type");

    jTable1.setModel(model);
    displayTable();
    jTable1.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
        @Override
        public void valueChanged(ListSelectionEvent e) {
            int row = jTable1.getSelectedRow();

            txtName.setText(jTable1.getValueAt(row, 1).toString());
            txtType.setText(jTable1.getValueAt(row, 2).toString());

        }
    });

}

public void displayTable() {
    try {
        model.setRowCount(0);
        ConnectToSQL sql = new ConnectToSQL();
        connection = sql.getConnection();
        st = connection.createStatement();
        ResultSet result = st.executeQuery("SELECT * FROM BOOK");
        while (result.next()) {
            model.addRow(new Object[]{result.getInt("id"), result.getString("name"), result.getString("type")});
        }

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

private void btnUpdateActionPerformed(java.awt.event.ActionEvent evt) {
    // TODO add your handling code here:
    int row = jTable1.getSelectedRow();
    String id = jTable1.getValueAt(row, 0).toString();
    try {
        // TODO add your handling code here:
        st.executeUpdate("Update Book set name ='" + txtName.getText() + "',type='" + txtType.getText() + "' where id =" + id);
        displayTable();

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

}

private void btnDeleteActionPerformed(java.awt.event.ActionEvent evt) {
    // TODO add your handling code here:
    int row = jTable1.getSelectedRow();
    String id = jTable1.getValueAt(row, 0).toString();
    try {
        // TODO add your handling code here:
        st.executeUpdate("Delete from book where id =" + id);
        displayTable();

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

}

您会遇到此错误,因为您没有选择任何行,因此为了避免此问题,您必须使用:

if(jTable1.getSelectedRow() != -1){
   int row = jTable1.getSelectedRow();
   String id = jTable1.getValueAt(row, 0).toString();
   //rest of your code here
}else{
   //show an error for example, no row is selected
}
int id = Integer.parseInt(jTable1.getValueAt(row, 0).toString());

注意

而不是:

st.executeUpdate("Update Book set name ='" + txtName.getText() + "',type='" + txtType.getText() + "' where id =" + id);
您必须使用PreparedStatement来避免任何语法错误或SQL注入

例如:

String query = "Update Book set name = ?, type=? where id =?";

try (PreparedStatement update = connection.prepareStatement(query)) {

    update.setString(1, txtName.getText());
    update.setString(2, txtType.getText());
    update.setInt(3, id);

    update.executeUpdate();
}
另外,您的id是一个
int
,因此您不能像设置int那样为查询设置字符串:

String id = jTable1.getValueAt(row, 0).toString();
相反,您必须使用:

if(jTable1.getSelectedRow() != -1){
   int row = jTable1.getSelectedRow();
   String id = jTable1.getValueAt(row, 0).toString();
   //rest of your code here
}else{
   //show an error for example, no row is selected
}
int id = Integer.parseInt(jTable1.getValueAt(row, 0).toString());

在哪一行?您在btnUpdateActionPerformed和btnDeleteActionPerformed中收到此错误我收到ArrayIndexOutOfBoundsException,即使它仍然删除或更新到数据库Well
-1
当您未选择行时,会发生此情况。,然后选择行返回
-1
。例如,如果
行=-1
,则
jTable1.getValueAt(-1,1)
,然后您会得到错误。为了避免它,您可以检查
如果(行!=-1){//do something}其他{//plz select a row}
我试图像您所说的那样修复,但它仍然出现异常,当我尝试在通过displayTable()删除或编辑数据后更新jtable时,它会出现异常function@TúAnhDư
ArrayIndexOutOfBoundsException
是否消失?,新的异常是什么?它仍然是ArrayIndexOutOfBoundsException:-1,我认为这不是getselectedRow()导致异常的原因,因为数据库在那之后更新了,但它来自displayTable()@TúAnhDư好的,你能调试你的程序并检查你的异常发生的确切位置吗?哇,它工作了,我将addListSelectionListener更改为jTableMouseClick,它工作得很好,但我不知道为什么不起作用。。。无论如何,谢谢你花时间帮我