在运行时获取ArrayIndexOutOfBoundsException异常

时间:2015-04-21 20:56:34

标签: java

我的代码编译,但我在运行时收到此错误:

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 5
at staffstore.writestaff(staffstore.java:16)
at addStaffGUI$2.actionPerformed(addStaffGUI.java:89)

这是我认为导致问题的代码部分:

        JButton submit = new JButton("Submit");
    submit.setBounds(145,470,100,20);
    panel2.add(submit);
    submit.addActionListener(new ActionListener() {
          public void actionPerformed(ActionEvent e) {
            stfname =(stfnametb.getText());
            stlname =(stlnametb.getText());
            staddress2 =(staddresstb.getText());
            stphone2 =(stphonetb.getText());

            try {
                staffstore.writestaff();
            } catch (IOException e1) {
                e1.printStackTrace();
            }
            third.dispose();

          }
        });

这是StaffStore.java的第9-19行

    String[] stlist = new String[5];
  /*stlist[0] = addStudentGUI.fname;
  stlist[1] = addStudentGUI.lname;
  stlist[2] = addStudentGUI.sgrade;
  stlist[3] = addStudentGUI.saddress;
  stlist[4] = addStudentGUI.sphone;*/ 

  stlist[5] = addStaffGUI.stfname;
  stlist[6] = addStaffGUI.stlname;
  stlist[7] = addStaffGUI.staddress2;
  stlist[8] = addStaffGUI.stphone2;

2 个答案:

答案 0 :(得分:4)

大小 n 的数组只能具有最大为 n-1 的索引位置。大小为5的数组的最高索引是4。

尽管如此,这四个声明都是非法的:

stlist[5] = addStaffGUI.stfname;
stlist[6] = addStaffGUI.stlname;
stlist[7] = addStaffGUI.staddress2;
stlist[8] = addStaffGUI.stphone2;

我不完全确定你的动机是什么,但你需要将这四个值放在界限内。

stlist[0] = addStaffGUI.stfname;
stlist[1] = addStaffGUI.stlname;
stlist[2] = addStaffGUI.staddress2;
stlist[3] = addStaffGUI.stphone2;

由于您还注释了其他值,因此增加数组大小也是一件简单的事情:

String[] stlist = new String[9];

...但是你必须确保你没有尝试在数组的前五个条目中的任何一个上调用任何方法。

答案 1 :(得分:2)

你有一个包含5个项目的数组,而你正试图在第6个位置获得该值。不要这样做。

String[] stlist = new String[5];
stlist[5] = addStaffGUI.stfname;

此外,您还尝试在单个数组中保存不同的信息,这是一种糟糕而脆弱的设计。而是创建一个数组或更好的数组,一个Staff列的员工项目。

// declared as a field of the class:
private List<Staff> staffList = new ArrayList<>();

// elsewhere
submit.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        String stfname = stfnametb.getText();
        String stlname = stlnametb.getText();
        String staddress2 = staddresstb.getText();
        String stphone2 = stphonetb.getText();

        // use information obtained to create a Staff object
        Staff staff = new Staff(stfname, stlname, staddress2, stphone2);

        // maybe done here, maybe in staffStore
        staffList.add(staff);

        try {
            // pass the Staff object into this method
            staffstore.writestaff(staff);
        } catch (IOException e1) {
            e1.printStackTrace();
        }
        third.dispose();
    }
});

从这次经历中获得的最重要的教训是:

  • 仅仅因为代码编译并不意味着正确
  • 异常堆栈跟踪通常包含关键信息,可以准确地告诉您哪些错误以及在哪里。仔细阅读并仔细查看它指示给你的线条。