2015-09-03 30 views
1

我有一个以jframe形式的销售表,用户一次添加一行。数组索引溢出异常当尝试更新Java数据库中的Java

我想在表中减少数量柱减少使用inStock在MySQL表saleifo

用于保存和打印按钮的代码段;

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);

如何解决这个问题?

+1

表有** 2 **行('rcount == 2'),所以'getValueAt(index,0)'对于索引'0'和'1'有效,但不是'2',这是你正在通过。 – Andreas

+0

JDBC建议:在创建连接时提前准备所有语句。每次单击按钮时都无需创建准备好的语句。此外,准备好的更新语句也应该与'?'占位符一起使用,而不是串联字符串。 – RealSkeptic

回答

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的,那么的可见行(SA由tableSale.getRowCount()返回很可能低于实际在基础数数表模型(如tableSale.getModel().getRowCount()返回,最后可见行的行号可能会在表格模型完全不同,您可以将可见的行号使用tableSale.convertRowIndexToModel()到行号模型,它将使线1039:。

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

在你的代码中,你最初检查是否有任何r在模型中行驶。但是在第1037行,您读取了可见行的数量。如果RowSorter带有过滤器,那么即使模型中有很多行,这可能会返回值0。这也会造成麻烦。