【问题标题】:List: set method causing problems - IndexOutOfBoundsException列表:设置方法导致问题 - IndexOutOfBoundsException
【发布时间】:2013-12-04 11:35:30
【问题描述】:

当我尝试调用 tableUpdate 方法时,我得到一个 IndexOutOfBoundsException
我认为我使用set() 方法的方式有问题。我曾尝试将a -1 放在这样的int row = members.size() -1 上,但这并没有解决问题。你能帮我么?

class MyTableModel extends AbstractTableModel {
        /**
                 *
                 */
        private static final long serialVersionUID = 1L;
        private List<Member> members = new ArrayList<Member>();

        public MyTableModel(List<Member> members) {
                this.members = members;
        }

        public void addMember(Member m) {
                members.add(m);
                int row = members.size() - 1;
                fireTableRowsInserted(row, row);
        }

        public void removeMemberFromTable(int row) {
                members.remove(row);
                fireTableRowsDeleted(row, row);
        }

        public void tableUpdate(int row, Member m) {
                row = members.size();
                members.set(row, m);
                fireTableRowsUpdated(row, row);
        }

        public List<Member> getMembers() {
                return new ArrayList<Member>(members);
        }

        @Override
        public int getColumnCount() {
                return 8;
        }

        @Override
        public int getRowCount() {
                return members.size();
        }

        @Override
        public Object getValueAt(int rowIndex, int columnIndex) {
                Member m = members.get(rowIndex);

                switch (columnIndex) {
                case 0:
                        return m.getMemberId();

                case 1:
                        return m.getfName();

                case 2:
                        return m.getlName();

                case 3:
                        return m.getAddress();

                case 4:
                        return m.getZipCode();

                case 5:
                        return m.getCity();

                case 6:
                        return m.getEmail();

                case 7:
                        return m.getPhoneNo();

                default:
                        return "";
                }
        }

        public String getColumnName(int column) {
                switch (column) {
                case 0:
                        return "MedlemsID";

                case 1:
                        return "Fornavn";

                case 2:
                        return "Efternavn";

                case 3:
                        return "Adresse";

                case 4:
                        return "Postnummer";

                case 5:
                        return "By";

                case 6:
                        return "Email";

                case 7:
                        return "Telefonnr";
                default:
                        return "";
                }
        }

        public Class<?> getColumnClass(int columnIndex) {
                switch (columnIndex) {
                case 0:
                        return String.class;

                case 1:
                        return String.class;

                case 2:
                        return String.class;

                case 3:
                        return String.class;

                case 4:
                        return String.class;

                case 5:
                        return String.class;

                case 6:
                        return String.class;

                case 7:
                        return String.class;

                default:
                        return String.class;
                }
        }

例外

Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 2, Size: 2
        at java.util.ArrayList.rangeCheck(ArrayList.java:604)
        at java.util.ArrayList.set(ArrayList.java:397)
        at gui.MyTableModel.tableUpdate(ShowMembersGUI.java:179)
        at gui.EditMemberGUI$1.actionPerformed(EditMemberGUI.java:108)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
        at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
        at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
        at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
        at java.awt.Component.processMouseEvent(Component.java:6505)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3312)
        at java.awt.Component.processEvent(Component.java:6270)
        at java.awt.Container.processEvent(Container.java:2229)
        at java.awt.Component.dispatchEventImpl(Component.java:4861)
        at java.awt.Container.dispatchEventImpl(Container.java:2287)
        at java.awt.Component.dispatchEvent(Component.java:4687)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
        at java.awt.Container.dispatchEventImpl(Container.java:2273)
        at java.awt.Window.dispatchEventImpl(Window.java:2719)
        at java.awt.Component.dispatchEvent(Component.java:4687)
        at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:735)
        at java.awt.EventQueue.access$200(EventQueue.java:103)
        at java.awt.EventQueue$3.run(EventQueue.java:694)
        at java.awt.EventQueue$3.run(EventQueue.java:692)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
        at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
        at java.awt.EventQueue$4.run(EventQueue.java:708)
        at java.awt.EventQueue$4.run(EventQueue.java:706)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:705)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)

【问题讨论】:

  • 为什么要用大小覆盖row参数?那不应该是您插入Member 的位置吗?您应该检查row 是否小于大小,但不要更改它。
  • tableUpdate 应该将 Member 放在行索引处,对吗?
  • 当我删除该行时,我得到 ArrayIndexOutOfBoundsException: -1 ...
  • 我在数据库中更新后调用该方法,因此它在数据库和表中都更新。
  • @user3008922 (将讨论移至此处,以免不必要地向 Jeroen 发送垃圾邮件)虽然答案处理了异常,但您的代码似乎还有另一个问题:似乎使用参数 @ 调用了该方法987654331@ 设置为-1,这没有意义,并且首先导致了异常。所以问题是:row 的真正含义是什么? -1 是一个有效的输入(意思是“追加到末尾”之类的),还是使用该方法的代码有错误?

标签: java swing user-interface indexoutofboundsexception


【解决方案1】:

列表是零索引的。这意味着最后一个元素的大小为 - 1,而不是大小。你有

   row = members.size();
   members.set(row, m); // tries to "overwrite" instance at index = size, 
                        // which is always greater than the last index.

这将始终抛出 IndexOutOfBoundsException,因为它是零索引,所以从来没有一个 size 的索引。

【讨论】:

    【解决方案2】:

    您想替换最后一个元素之后的元素。这没有意义。也许您想检查索引是否在范围内,如下所示:

    public void tableUpdate(int row, Member m) {
        if (row < members.size()) {
            members.set(row, m);
            fireTableRowsUpdated(row, row);
        }
    }
    

    【讨论】:

    • 现在它给了我 java.lang.ArrayIndexOutOfBoundsException: -1 .
    • 好的,然后像这样: if (row >= 0 && row
    • 非常感谢。我应该自己做的。 :-)
    • 好的,但是现在该行根本没有设置...为什么首先是row==-1?它应该是什么意思?
    • 检查/调试 ShowMembersGUI.java 第 179 行的代码。根据堆栈跟踪,它决定替换值 -1。
    猜你喜欢
    • 2019-10-23
    • 1970-01-01
    • 2016-04-04
    • 1970-01-01
    • 2017-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多