如何修复java.lang.ArrayIndexOutOfBoundsException错误

时间:2014-04-26 00:50:14

标签: java arrays jfilechooser

我在尝试使用JFileChooser扫描文本文件时遇到错误,将其添加到数组并将其中一个字符串解析为double,将两个解析为整数。是否与addEmployee方法将六个参数添加到arrayList这一事实有关?这是代码......

else if (e.getSource()==readButton){
            JFileChooser fileChooser = new JFileChooser("src");
        if  (fileChooser.showOpenDialog(null)==JFileChooser.APPROVE_OPTION)
        {
            empFile=fileChooser.getSelectedFile();
        }
            Scanner scan = new Scanner("empFile");
            while(scan.hasNext()){
                String[] rowData = scan.next().split(":");
                if(rowData.length == 5){
                    rowData[4] = null;
                    fName = rowData[0];
                    lName = rowData[1];
                    position2 = rowData[2];
                    firstParam = Double.parseDouble(rowData[3]);
                    secondParam = Integer.parseInt(rowData[4]);
                    empNum = Integer.parseInt(rowData[5]);
                }
                else{
                fName = rowData[0];
                lName = rowData[1];
                position2 = rowData[2];
                firstParam = Double.parseDouble(rowData[3]);
                secondParam = Integer.parseInt(rowData[4]);
                empNum = Integer.parseInt(rowData[5]);
                }
                if (position2.equals("Manager")){
                    c.addEmployee(fName, lName, position2, firstParam, 0, empNum);
                }
                else if(position2.equals("Sales")){
                    c.addEmployee(fName, lName, position2, firstParam, 0, empNum);
                }
                else{
                    c.addEmployee(fName, lName, position2, firstParam, secondParam, empNum);
                }
            }

        }
  

约翰:史密斯:制造:6.75:120:444

     

贝:白色:管理器:1200.00:111

     

斯坦:粘糊糊:销售:10000.00:332

     

贝:布普:设计:12.50:50:244

2 个答案:

答案 0 :(得分:2)

您正在尝试获取empNum = Integer.parseInt(rowData [5]);

行数据只有大小5表示索引0-4,这就是为什么ArrayIndexOutOfBoundsException正在获取

所以Initialize String [] rowData = new String [6];

答案 1 :(得分:1)

  String[] rowData = new String[5]; // edited out of original post
  rowData = scan.next().split(":");

第一个语句分配一个5 Strings的数组,并将它们全部设置为null。第二个语句只丢弃你刚刚分配的数组。 split的结果将返回它找到的许多项目的数组,然后您将rowData(一个引用)分配给一个数组,以引用新的阵列。旧的收集垃圾。因此,无法保证rowData在此作业后将有5个元素。

如果split没有返回足够的数组元素,您必须决定要执行的操作。您可以使用类似Arrays.copyOf的内容,将split结果放入某些rowData元素中,而其他元素保持不变,但未分配的元素仍为null,而你以后只会得到NullPointerException几行。所以你在这里做了一些设计决定。

更多:您可能需要考虑使用Scanner方法nextLine()代替next()next()只返回一个标记,这意味着它将停留在空格字符处,这意味着如果有人被命名为你将会遇到问题" Mary Beth"或类似的东西。