[英]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.