Java ArrayIndexOutOfBounds异常 -

时间:2014-11-07 07:09:11

标签: java swing indexoutofboundsexception

我的表单中有2个面板绑定到父面板,其面板设置为卡片布局。

JFrame的构造函数中,执行数据库操作并获取数据并用于填充JList

然后,当用户点击某个项目时,新的面板(作为CardLayout的一部分)会显示JTable,其中填充了根据用户所做的选择从数据库中获取的数据列表框。

该计划基本上是一个诊所管理系统。

在此JFrame中,收银员可以查看要支付账单的患者的身份证号码。这些ID号在JList中显示为列表。

点击列表后,选择患者ID,然后从数据库中查询处方药并显示在表中,同时显示药物ID&价钱。

问题在于,每当我尝试向ArrayOutOfBoundsException添加行时,我都会收到JTable

这些是在mouseclick事件(全局)

之外声明的
private Connection medDbConn = Connect("medicines.db");
private PreparedStatement mPst = null;
private ResultSet mRs = null;

private Connection conn = Connect("bills.db");
private PreparedStatement pst = null;
private ResultSet rs = null;

private ArrayList medicines_fine = new ArrayList();
private ArrayList medicines_fine_name = new ArrayList();
private ArrayList medicines_fine_qty = new ArrayList();
private ArrayList medicines_id = new ArrayList();
private ArrayList medicines_price = new ArrayList();
private ArrayList medicines_subtotal = new ArrayList();

private Double cf = 0.00;
/**
 * Creates new form ViewBills
 */
private DefaultListModel listmodel;
private DefaultListModel model;

以下内容在JList的鼠标点击事件中执行。

        // GET SELECTED VALUE FROM LIST
    String listvalue = (String) jList1.getSelectedValue();

    // SPLIT THE SELECTED LIST VALUE INTO ID AND DATETIME
    String[] datas = listvalue.split("=");

    // datas[0] = id and datas[1] = datetime
    // STORE PATIENTID and DATETIME
    String Patient_Id = datas[0].trim();
    String DateTime = datas[1].trim();

    String medicines_raw = null;
    String[] medicines;
    String[] keypair;

    try {

        // CONNECT THE DATABASE & PREPARE IT . THEN SET THE VALUES & FURTHER EXECUTE QUERY TO GET RESULT INTO "rs"
        pst = conn.prepareStatement("SELECT CONSULTFEE,MEDICINES FROM VIEWBILLS WHERE ID=? AND DATETIME=?");
        pst.setString(1, Patient_Id);
        pst.setString(2, DateTime);
        rs = pst.executeQuery();

        // IF THERE IS A RECORD , THEN DO SOMETHING
        if (rs.next()) {

            cf = rs.getDouble("consultfee");

            // GET THE RAW VALUE IN THE FORMAT Aspirin=12,sdsd=1,asdasd=2
            medicines_raw = rs.getString("medicines");

            // SPLIT THE WORD BY COMMAS AND STORE INTO ARRAY , SO EACH INDEX has Aspirin=12 kind of values
            medicines = medicines_raw.split(",");

            for (int i = 0; i < medicines.length; i++) {

                medicines_fine.add(medicines[i]);
            }

            for (int i = 0; i < medicines_fine.size(); i++) {
                keypair = medicines_fine.get(i).toString().split("=");

                medicines_fine_name.add(keypair[0]);
                System.out.println(keypair[0]);
                System.out.println(keypair[1]);
                medicines_fine_qty.add(keypair[1]);
            }

        }

    } catch (Exception e) {

        JOptionPane.showMessageDialog(null, e);
    }

    CardLayout cl = (CardLayout) Parent.getLayout();
    cl.show(Parent, "card3");

        // SECOND DATABASE CONNECTION STARTS HERE ...

    for (int i = 0; i < medicines_fine_name.size(); i++) {
            try {

                pst = medDbConn.prepareStatement("SELECT ID,SELLPRICE FROM MEDICINES WHERE NAME=?");
                pst.setString(1, (String) medicines_fine_name.get(i));

                rs = pst.executeQuery();

                if (rs.next()) {

                    medicines_id.add(rs.getString("id"));
                    medicines_price.add(rs.getDouble("sellprice"));

                }

            } catch (Exception e) {

                JOptionPane.showMessageDialog(null, e);
            }

        for ( int i = 0; i < medicines_fine_name.size() ; i++) {
            tblmodel.addRow(new Object[] {medicines_id.get(i),medicines_fine_name.get(i),medicines_price.get(i),medicines_fine_qty.get(i)});
        }
    }

如果删除了最后一个for循环,整个事情有时会毫无错误地运行。 (但这超出了目的)

是的,我说过#34;有时&#34; ..我非常困惑,你可以看到,这段代码是以非常丑陋的方式编写的。我用正常的方式写了它,但这个ArrayIndexOutOfBoundsException让我重写了整个代码3次,最后我写的很糟糕&amp;丑陋的代码,但错误仍然挂在上面。

如果还有什么不清楚,请告诉我 编辑1:基本上我想要做的是从jlist中选择的字符串,使用split()函数分隔datetime部分和id部分并将它们存储到数组中。然后使用此ID和名称从数据库中选择药物。 &#34;药品&#34;是一个包含逗号分隔值的字符串,如Aspirin = 2,Amoxylin = 5,etc = 2,etc = 10其中= 10表示其中10个(表示数量。然后药物名称存储在arraylist中,而qty存入另一个。然后使用这个医药名称来获取medicine_id和sellprice。最后将所有这些都设置为一个表格。

1 个答案:

答案 0 :(得分:0)

问题在于:

for ( int i = 0; i < medicines_fine_name.size() ; i++) {
        tblmodel.addRow(new Object[]   {medicines_id.get(i),medicines_fine_name.get(i),medicines_price.get(i),medicines_fine_qty.get(i)});
}

你在arraylist中迭代索引,其中没有元素存在。

你正在做的是你发出两个查询,在第一个查询中说你有10条记录。

现在在第二个查询中,您迭代10条记录(从第一个查询结果处理并传入arrayList)并在查询中触发10次。您可能会或可能不会获得记录,而且您可以:

if (rs.next()) {
    medicines_id.add(rs.getString("id"));
    medicines_price.add(rs.getDouble("sellprice"));
 }

如果满分为10,那么你获得的药物大小为5,那么药物价格就会达到5。

现在是你的最后一个循环。在for循环中,您尝试按照第一个查询(medicines_fine_name.size())迭代MEDIC_id,medicines_fine_name,medicines_price,medicines_fine_qty,直到大小为10。

所以,当你进入索引6时,你试着继续说

medicines_id.get(6)

但是这个元素从未根据你的第二个查询填充,因此ArrayIndexOutOfBoundException。

要解决这个问题,一种方法是使用else部分将虚拟值填充到id和price,如下所示:

if (rs.next()) {
    medicines_id.add(rs.getString("id"));
    medicines_price.add(rs.getDouble("sellprice"));
 } else {
    medicines_id.add(rs.getString("9999"));
    medicines_price.add(rs.getDouble("10.00"));
 }