【问题标题】:Why does it throw an IndexOutOfBoundsException?为什么会抛出 IndexOutOfBoundsException?
【发布时间】:2021-12-20 13:06:30
【问题描述】:

我有一个带有表格和退出按钮的框架。我想在我的表中添加一些数据,但这不能正常工作:当我首先打开我的框架时,数据是好的,例如“Nima,Rahmani,...”,然后我点击退出按钮并再次打开我的框架,表格现在有两次“Nima,Rahmani,...”,当我现在单击退出按钮时,会抛出一个 IndexOutOfBoundsException

我的框架:

public class DeathList extends javax.swing.JFrame {

private Admin admin;
private ArrayList<Death> list;
DefaultTableModel model;

/** Creates new form DeathList */
public DeathList(Admin admin) {
    initComponents();
    this.admin = admin;
    Manager.admin = admin;
    try {
        Manager.addToDeathListFromMySQL();
    } catch (SQLException ex) {
        Logger.getLogger(DeathList.class.getName()).log(Level.SEVERE, null, ex);
    }

    fillTable();

}

private void fillTable() {
    String[] columNames = {"name", "family", "father's name", "date of birth",
                           "date of death", "date of confirmation",
                           "grave column", "grave row"};
    List<Death> death = admin.getDeathList();
    if (death.isEmpty()) {
        JOptionPane.showMessageDialog(this, "Death list is empty! First, add a person.",
                                      "Error", JOptionPane.ERROR_MESSAGE);
    } else {

        Object[][] data = new Object[death.size()][columNames.length];
        for (int i = 0; i < data.length; i++) {
            Death death1 = death.get(i);
            data[i][0] = death1.getName();
            data[i][1] = death1.getFamily();
            data[i][2] = death1.getFatherName();
            data[i][3] = death1.getDateOfBirth();
            data[i][4] = death1.getDateOfDeath();
            data[i][5] = death1.getDateOfConfirmation();
            data[i][6] = death1.getGraveColumn();
            data[i][7] = death1.getGraveRow();

        }
        model = new DefaultTableModel(data, columNames);
        jTable1.setModel(model);

    }

}
private void cBActionPerformed(java.awt.event.ActionEvent evt) {
    List<String> d = new ArrayList<String>();
    List<String> d1 = new ArrayList<String>();
    List<String> d2 = new ArrayList<String>();
    List<String> d3 = new ArrayList<String>();

    for (int i = 0; i < jTable1.getRowCount(); i++) {
        String name = (String) jTable1.getValueAt(i, 0);
        String name1 = (String) jTable1.getValueAt(i, 1);
        String name2 = (String) jTable1.getValueAt(i, 2);
        String name3 = (String) jTable1.getValueAt(i, 3);
        if (name != null && name1 != null && name2 != null && name3 != null) {
            d.add(name);
            d1.add(name1);
            d2.add(name2);
            d3.add(name3);
            d.clear();
            d1.clear();
            d2.clear();
            d3.clear();
            Object[][] data1 = new Object[i][4];
            for (int j = 0; j < data1.length; j++) {
                String s = d.get(j);
                String s1 = d1.get(j);
                String s2 = d2.get(j);
                String s3 = d3.get(j);
                data1[j][0] = s;
                data1[j][1] = s1;
                data1[j][2] = s2;
                data1[j][3] = s3;
            }

            model = new DefaultTableModel(data1, 4);
            jTable1.setModel(model);
            fillTable();

        } else {
            fillTable();
        }
    }
    int r = JOptionPane.showConfirmDialog(this, "Are you sure?", "Message",
                                          JOptionPane.YES_NO_CANCEL_OPTION);
    if (r == JOptionPane.YES_OPTION) {
        this.dispose();// TODO add your handling code here:
    }
}}

堆栈跟踪:

Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
    at java.util.ArrayList.RangeCheck(ArrayList.java:547)
    at java.util.ArrayList.get(ArrayList.java:322)
    at AdminGUI.DeathList.cBActionPerformed(DeathList.java:192)
    at AdminGUI.DeathList.access$000(DeathList.java:28)
    at AdminGUI.DeathList$1.actionPerformed(DeathList.java:122)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
    at java.awt.Component.processMouseEvent(Component.java:6038)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3265)
    at java.awt.Component.processEvent(Component.java:5803)
    at java.awt.Container.processEvent(Container.java:2058)
    at java.awt.Component.dispatchEventImpl(Component.java:4410)
    at java.awt.Container.dispatchEventImpl(Container.java:2116)
    at java.awt.Component.dispatchEvent(Component.java:4240)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4322)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3986)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3916)
    at java.awt.Container.dispatchEventImpl(Container.java:2102)
    at java.awt.Window.dispatchEventImpl(Window.java:2429)
    at java.awt.Component.dispatchEvent(Component.java:4240)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)

Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
        at java.util.ArrayList.RangeCheck(ArrayList.java:547)
        at java.util.ArrayList.get(ArrayList.java:322)
        at AdminGUI.DeathList.cBActionPerformed(DeathList.java:192)
        at AdminGUI.DeathList.access$000(DeathList.java:28)
        at AdminGUI.DeathList$1.actionPerformed(DeathList.java:122)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
        at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
        at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
        at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
        at

javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
        at java.awt.Component.processMouseEvent(Component.java:6038)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3265)
        at java.awt.Component.processEvent(Component.java:5803)
        at java.awt.Container.processEvent(Container.java:2058)
        at java.awt.Component.dispatchEventImpl(Component.java:4410)
        at java.awt.Container.dispatchEventImpl(Container.java:2116)
        at java.awt.Component.dispatchEvent(Component.java:4240)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4322)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3986)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3916)
        at java.awt.Container.dispatchEventImpl(Container.java:2102)
        at java.awt.Window.dispatchEventImpl(Window.java:2429)
        at java.awt.Component.dispatchEvent(Component.java:4240)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)

【问题讨论】:

  • 相对简单的解决方案,但由于您只接受了您提出的最后 15 个问题中的 1 个答案,因此我认为回答问题没有意义。要么您没有阅读答案,要么您不感谢您获得的帮助
  • 在这里使用像样的调试器有什么问题?这可能是一个很好的教训,学习自己找出答案。例如,在 Eclipse 中,您可以添加某些要识别的异常(断点视图 -> “添加 Java 异常断点”),并让调试器在它们发生时停止。意思是:你让你的程序运行,它在异常(这里是IndexOutOfBoundsException)发生的位置停止。然后您将使用变量视图并检查发生了什么。
  • 如果我的回答有用,你打算什么时候检查它作为你接受的答案?
  • 3 年后仍未被接受。
  • 8 年后仍未被接受。

标签: java indexoutofboundsexception


【解决方案1】:

你遇到的问题是因为你在列表中添加了一些东西

d.add(name);

你清除列表,

d.clear();

然后您尝试访问该列表中的元素:

String s = d.get(j); // IndexOutOfBoundsException: Index: 0, Size: 0

【讨论】:

  • 你看我的评论了吗?如果你继续用勺子喂他们答案,人们不会改变。此人发布的所有问题都是基本的家庭作业问题,并且该人没有听取有关调试代码的简单方法或跟进简单的“谢谢”的建议,这是通过接受正确的答案来完成的。只有当人们停止提供答案时,行为才会改变,因为这样个人就会开始不及格。
  • @camickr 相当恰当,我在将近 3 年后偶然发现了这个问题,而这个答案是正确的,并且是唯一一个已发布的答案,但仍未被接受..
猜你喜欢
  • 2013-02-07
  • 1970-01-01
  • 2014-07-04
  • 2023-03-28
  • 1970-01-01
  • 2021-03-05
  • 2021-03-19
  • 2023-03-14
  • 1970-01-01
相关资源
最近更新 更多