Getting Array out of bound exception in my code

时间:2017-06-15 10:07:05

标签: java java-ee

The code below throws an Array out of bound exception. I want to print the blank value also.

Here sourceDir[i].length=3 and targetDir[i].length=10. If I remove sourceDir[i].getName then it works fine.

int compareSize = sourceDir.length > targetDir.length ? sourceDir.length : targetDir.length;
    String[] resultArr = null;
    String resultFilename = null;

    for(int i = 0; i < compareSize; i++){
        resultFilename = currDir + "\\Results\\Result" + (i+1) + ".htm";
        readReport = new BufferedReader(new FileReader(resultFilename));
        resultArr = getResult(readReport);

        bw.write("<tr><td>" + (i+1) +  "</td><td>" + sourceDir[i].getName() + "</td><td>" 
                + targetDir[i].getName() + "</td><td>" + resultArr[0] + "</td><td>" + resultArr[1] 
                + "</td><td>" + "<a href=\"Result" + (i+1) + ".htm\">Link to Result</a></td></tr>");
    }

    bw.write("</tr></table></Div></Body></html>");
    bw.close();
}

2 个答案:

答案 0 :(得分:0)

这个问题的答案是直截了当的。

  1. 考虑sourceDir.length = 5和targetDir.length = 3.
  2. 在这种情况下,compareSize = 5
  3. 现在您正在运行从i = 0到4的for循环。
  4. 当i = 3时,sourceDir [3] .getName()工作正常,但是targetDir [3] .getName()将抛出一个ArrayIndexOutOfBoundsException,因为targertDir [3]不存在!
  5. 如果targetDir.length&gt; sourceDir.length

    ,您将获得sourceDir [i] .getName()的相同ArrayIndexOutOfBoundsException

答案 1 :(得分:0)

好的compareSize将等于更大的数字长度。你的问题在你的循环中你的一个dir更小,所以当[i]达到一个更高的数字然后更小的dir的长度它将超出界限。

一种解决方案是将resultArr更改为:

typedef struct node{
    int column;
    int value;
    int row;
    struct node *next;
} element;

在for循环中(确保没有任何超出界限):

List<String> resultArr = new ArrayList<>();

在第一个for循环之外,您可以立即遍历resultArr arrayList:

 if(i < sourceDir.length){
        System.out.println(sourceDir[i]);   //just so you can see value
        resultArr.add(sourceDir.get(i));    //add everything to an arrayList
    }
 if(i < targetDir.length){
        System.out.println(targetDir[i]);   //just so you can see value
        resultArr.add(targetDir.get(i))     //add everything to an arrayList

    }

你也可以为每个循环使用a,但是如果你是java的新手,那么你对对象的理解可能是不存在的