为什么我会得到ArrayIndexOutOfBoundsException?

时间:2012-01-31 15:55:44

标签: java arrays exception

我读了一个文件并将其添加到列表中然后读取列表并拆分字符串并进行比较并对其进行处理。 我得到了这个例外:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1

我应该在哪里更正我的代码?

for (Productname m : listIP) {
        if (m.getIdentifier() == null || m.getProductname() == null) {
                addToNonSimilarList( m.getProductname());
        } else {
            String id = m.getIdentifier().replaceAll("(?<=[A-Za-z])(?=[0-9])|(?<=[0-9])(?=[A-Za-z])", " ").toUpperCase();
            String product = m.getProductname().replaceAll("(?<=[A-Za-z])(?=[0-9])|(?<=[0-9])(?=[A-Za-z])", " ").toUpperCase();
            id = id.replaceAll("\\s+", " ");
            product = product.replaceAll("\\s+", " ");
            if (!id.equalsIgnoreCase(product)) {
                if (id.contains(" X ") && product.contains(" X ")) {
                    String[] ide = id.split(" (?=X\\s*\\d+)");
                    String[] prod = product.split(" (?=X\\s*\\d+)");
                    System.out.println(m.getMnemonic());
                    if (ide.length > 0 && prod.length > 0 && ide[1].trim().equalsIgnoreCase(prod[1].trim())) {
                        String[] i = ide[0].split(" (?=\\d+)");
                        String[] p = prod[0].split(" (?=\\d+)");
                        if (i[0].trim().equalsIgnoreCase(p[0].trim())) {
                            //do nothing
                        } else {
                            addToNonSimilarList( m.getProductname());
                        }
                    } else {
                        addToNonSimilarList( m.getProductname());
                    }
                } else {
                    addToNonSimilarList( m.getProductname());

                }
            }
        }

    }

2 个答案:

答案 0 :(得分:2)

嗯,这种情况看起来很狡猾:

if (ide.length > 0 && prod.length > 0 
    && ide[1].trim().equalsIgnoreCase(prod[1].trim())) {

您正在测试每个中是否至少有一个元素,但每个元素中都使用第二个元素。

很难说出你想要实现的目标,但我怀疑你要么想要改变length条件,要么改变数组索引。我还将此方法拆分为较短的方法,并且为了清楚起见,可能会创建具有引用Pattern对象的名称良好的静态变量...

编辑:如果你真的想要使用每个数组中的第二个元素,我建议:

if (ide.length > 1 && prod.length > 1 
    && ide[1].trim().equalsIgnoreCase(prod[1].trim())) {

答案 1 :(得分:1)

 if (ide.length > 0 && prod.length > 0 && ide[1].trim().equalsIgnoreCase(prod[1].trim()))

如果长度等于1,那么第一个元素可以被ide [0]和prod [0]访问,但是,你分别使用ide [1]和prod [1]。这就是错误来自

的地方