从文件中读取注释时的Java ArrayList IndexOutOfBound

时间:2017-02-11 22:10:08

标签: java arraylist

我正在编写一个程序来读取文件,然后检查是否有相同数量的关闭和打开括号。因此我所做的是使用FileInputStream和Scanner类来读取文件并将每个字符存储在ArrayList中。如果读取的文件没有以块注释结束,那么我的程序大部分时间都可以工作。以下是我的代码。

private Input input;
private ArrayList<Character> fileText;

public q1_19() {
    input = new Input();
    fileText = new ArrayList<Character>();
}

private void storeTextInArray(String name) {
    FileInput readFile = new FileInput(name); //Makes use of Scanner and FileInputStream

    while(readFile.hasNextChar()) {
        fileText.add(readFile.nextChar());
    }
    readFile.close();
}

private boolean booleanChecker() {
    int braces = 0;

    boolean lineComment = false;
    boolean blockComment = false;
    boolean constant = false;
    boolean string = false;

    for (int i = 0; i < fileText.size(); i ++) {

        //Case lineComment
        if ((fileText.get(i) == '/') && (fileText.get(i+1) == '/') && ((i+1)<fileText.size())) {
            lineComment = true;
        }

        if ((lineComment) && (fileText.get(i) == '\n')) {
            lineComment = false;
        }

        //Case constant
        if ((fileText.get(i) == '\'') && (fileText.get(i+2) == '\'') && ((i+2)<fileText.size())) {
            constant = true;
            i++;
        }

        //End String
        if ((string) && (fileText.get(i) == '"')) {
            string = false;
        }

        //End blockComment
        if ((blockComment) && (fileText.get(i) == '*') && (fileText.get(i+1) == '/') && (i+1 < fileText.size())) {
            blockComment = false;
            if (fileText.lastIndexOf(fileText) == i) {
                break;
            }
        }

        if (!(lineComment || blockComment || constant || string)) {
            //String constant
            if (fileText.get(i) == '"') string = true;

            if ((fileText.get(i) == '/') && (fileText.get(i+1) == '*') && (i+1 < fileText.size())) blockComment = true;

            if (!(lineComment || blockComment || constant || string)) {
                if (fileText.get(i) == '{') { braces ++; System.out.println("+1"); }
                if (fileText.get(i) == '}') { braces --; System.out.println("-1"); }
                }
        }

        constant = false;
    }
    System.out.println(braces);
    if (braces != 0) return false;
    else return true;
}

例如,当我尝试阅读时 {{}} /**/,我得到的错误是 java.lang.IndexOutOfBoundsException: Index: 4, Size: 4 at java.util.ArrayList.rangeCheck(ArrayList.java:653) at java.util.ArrayList.get(ArrayList.java:429)

这不是一个真正的问题,因为我可以阅读大多数文件,但我只想了解原因。如果我错误地问了一个问题,请原谅我,因为这是我在StackFlow上的第一个问题。非常感谢你。

3 个答案:

答案 0 :(得分:1)

您的支票不正确:

if ((fileText.get(i) == '/') && (fileText.get(i+1) == '/') && ((i+1)<fileText.size())) {

并非完全缺少检查,但是从左到右评估条件,因此在执行检查正确长度之前,您对fileText.get(i+1)的访问是。< / p>

将其更改为:

if ((fileText.get(i) == '/') && ((i+1)<fileText.size() && fileText.get(i+1) == '/')) {

答案 1 :(得分:0)

在你的条件下,你在许多地方检查(i + 1),(i + 2),在那里我可以到达fileText.size() - 1。这将导致outofBound数组异常。

    if ((fileText.get(i) == '/') && (fileText.get(i+1) == '*') && (i+1 < fileText.size())) blockComment = true;

答案 2 :(得分:0)

这很简单。您尝试访问金额中的字段。你的最后一个字符就像'/',但你试图访问另一个不可用的字符。请参阅下面的代码行

//Case lineComment
    if ((fileText.get(i) == '/') && (fileText.get(i+1) == '/') && ((i+1)<fileText.size())) {
        lineComment = true;
    }

假设i = fileText.size() - 1,以及

时会发生什么
fileText.get(i)   // nothing all is fine
fileText.get(i+1) // ??? occur exception IndexOutOfBound