簡體   English   中英

嘗試在Java中更新MySQL數據庫時,數組索引超出范圍異常

[英]Array Index Out Of Bounds Exception When trying to update MySQL database in Java

我有一個jframe形式的銷售表,用戶一次添加一行。

我想在表中減少數量列,以減少MySQL表saleifo 的inStock。

保存和打印按鈕的代碼段;

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

    if(model.getRowCount()==0){
       JOptionPane.showMessageDialog(null, "You have nothing to Print or Save ");

    }else{
       int save = JOptionPane.showConfirmDialog(null, "Do you really want to Save the Invoice Data ?","Save Confirmation",JOptionPane.YES_NO_OPTION);
       if((save)==0){

        try{

            String saledate = ((JTextField)dayChooser.getDateEditor().getUiComponent()).getText();
            String invoice = InvoiceNo_txt.getText();
            String citems = countitems_txt.getText();
            String tDis =totalDiscount_txt.getText();
            String ntotal = NetTotal_txt.getText();

            //setting data to saleinfo db table
            try{
                String sql = "Insert into saleinfo (SaleDate,InvoiceNo,TotalItems,TotalDiscount,NetTotal)values (?,?,?,?,?)";

                pst=conn.prepareStatement(sql);


                pst.setString(1, saledate);
                pst.setString(2, invoice);
                pst.setString(3, citems);
                pst.setString(4, tDis);
                pst.setString(5, ntotal);

                pst.execute();

            }catch(Exception e){

            }


            //redusing stock in db

            int rcount = tableSale.getRowCount();

            String idsale = (String) tableSale.getModel().getValueAt(rcount, 0);

            String sql0= "select * from druginfo where ItemID=?";

            pst0=conn.prepareStatement(sql0);
            pst0.setString(1, idsale);

            rs0= pst0.executeQuery();

            if(rs0.next()){
                String instock = rs0.getString("InStock");

                int nowstock=Integer.parseInt(instock);
                int soldqty = (int) tableSale.getModel().getValueAt(rcount, 3);

                int newstock = nowstock - soldqty;

                System.out.println("new :"+newstock);

                String sqlupdate= "update druginfo set InStock='"+newstock+"' where ItemID='"+idsale+"'";
                pst=conn.prepareStatement(sqlupdate);
                pst.execute();
                System.out.println("Done");

            }

但是顯示ArrayIndexOutOfBoundsException

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 2 >= 2
at java.util.Vector.elementAt(Vector.java:474)  at java.util.Vector.elementAt(Vector.java:474)
at javax.swing.table.DefaultTableModel.getValueAt(DefaultTableModel.java:648)
at com.bit.project.Newsale.saveprint_btnActionPerformed(Newsale.java:1039)
at com.bit.project.Newsale.access$1300(Newsale.java:57)
at com.bit.project.Newsale$16.actionPerformed(Newsale.java:683)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)

第1039行是String idsale = (String) tableSale.getModel().getValueAt(rcount, 0);

如何解決這個問題?

在第1037行,將表中可見行的數量分配給int rcount,在這種情況下為2。但是,在第1039行,您使用此值嘗試從表中獲取“行2,列0”的值模型。

由於行和列的索引從0開始,並且只有兩行分別編號為0和1,因此,當您請求第2行時也就不足為奇了!

如果您打算獲取表的第一列和最后一行中單元格的值,則需要將第1039行更改為:

String idsale = (String) tableSale.getModel().getValueAt(rcount-1, 0);

您已經在執行到達這一點時檢查rcount > 0,所以這不會造成麻煩。 除了...

值得注意的是,如果表上附加了RowSorter,則可見行數(由tableSale.getRowCount()返回的tableSale.getRowCount()可能會比基礎表模型中的實際行數(由tableSale.getModel().getRowCount()返回的值) tableSale.getModel().getRowCount()和表模型中最后一個可見行的行號可能完全不同。您可以使用tableSale.convertRowIndexToModel()將可見行號轉換為模型行號,這將使第1039行:

String idsale = (String) tableSale.getModel().getValueAt(
    tableSale.convertRowIndexToModel(rcount - 1), 0);

首先,在代碼中檢查模型中是否有任何行。 但是在1037行,您讀取了可見行的數量。 如果存在帶有過濾器的RowSorter,則即使模型中有很多行,也可能返回0值。 這也會在這里引起麻煩。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM