【问题标题】:How to fix java.lang.ArrayIndexOutOfBoundsException error如何修复 java.lang.ArrayIndexOutOfBoundsException 错误
【发布时间】:2014-04-26 00:50:13
【问题描述】:

我在尝试使用 JFileChooser 扫描文本文件时遇到错误,将其添加到数组并将其中一个字符串解析为双精度数,将两个字符串解析为整数。是否与 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

Stan:Slimy:Sales:10000.00:332

贝蒂:Boop:设计:12.50:50:244

【问题讨论】:

  • 在此处发布堆栈跟踪/错误
  • 也是你正在解析的文件的内部
  • 对不起,堆栈跟踪/错误是什么?而且我不只是解析数组的 [3]、[4] 和 [5] 文件。
  • java给你的错误复制粘贴到这里,我们可以检查一下
  • 线程“AWT-EventQueue-0”中的异常 java.lang.ArrayIndexOutOfBoundsException: 1 at GUI$aListener.actionPerformed(GUI.java:329) 这是错误所在,第 329 行是 lName =行数据[1];

标签: java arrays jfilechooser


【解决方案1】:

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

只有大小为 5 的行数据意味着索引 0-4,这就是 ArrayIndexOutOfBoundsException 越来越多的原因

所以初始化 String[] rowData = new String[6];

【讨论】:

  • 所以我已经将代码编辑为上面的样子,但我得到了同样的错误可能与 textFile 的样子有关吗?
  • 你必须将 rowData 初始化为 String[] rowData = new String[6]
  • 好的,所以我在上面的帖子中添加了文本文件的文本。您的答案似乎正确,但没有奏效。
  • 我做到了,但它没有做到。
  • 现在您也遇到了同样的异常。你能发布异常字符串吗
【解决方案2】:
  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,您只会得到一个@ 987654332@ 几行后。因此,您需要在此处做出一些设计决策。

更多:您可能需要考虑使用Scanner 方法nextLine() 而不是next()next() 将只返回一个标记,这意味着它将在一个空格字符处停止,这意味着如果有人被命名为“Mary Beth”或类似的名称,您将遇到问题。

【讨论】:

  • 哦,其实我明白你在说什么,我怎样才能让它在什么都没有的时候放置一个空值。
  • 您的ifif elseelse 如何检查错误的字段数?不管怎样,你看看rowData[5]之前你的if。如果某个职位没有那么多字段,您需要确保在检查该职位之后之前不要尝试访问不存在的字段。
  • 好的,如您在上面看到的,我已经编辑了代码,但我在 lName = rowData[1]; 上遇到了同样的错误的 else 语句。如何制作代码以便读取代码并检查长度。
  • @user3530205 我不知道您为什么会收到错误消息;也许您需要打印 rowData.length 并查看它是什么,也许还需要打印您要拆分的字符串(通过将 scan.next() 保存在变量中)。您已经知道如何查看rowData.length。但是如果它是 0 或 1,你需要找出原因,如果它是你的输入文件中的一个错误,你可能应该在做任何其他事情之前做一个“健全性检查”(if (rowData.length < 5) then 打印一个错误消息else { 做其余的逻辑},或其他。
猜你喜欢
  • 1970-01-01
  • 2019-03-27
  • 1970-01-01
  • 1970-01-01
  • 2016-01-10
  • 1970-01-01
  • 2015-06-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多