2017-02-11 2 views
0

Я пишу программу, которая читает файл, а затем проверяет, существует ли равное количество закрытых и открытых скобок. Таким образом, я использовал FileInputStream и класс Scanner для чтения файла и сохранения каждого символа в ArrayList. Моя программа работает большую часть времени, если чтение файла не заканчивается комментарием блока. Вот мой код ниже.Java ArrayList IndexOutOfBound при чтении комментариев из файла

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. Большое спасибо.

+0

Вы зацикливание от 0 до 'длина - 1', но у вас есть 'fileText.get (i + 1)'. Это выйдет за пределы массива, так как максимальный индекс массива будет 'length - 1', и вы эффективно переходите от 1 до' length'. – Moira

ответ

1

Ваши чеки неверны:

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

Это не то, что чеки полностью отсутствуют, но условия вычисляются слева направо, так что ваш доступ к fileText.get(i+1) происходит , прежде чем чек на выполняется правильная длина.

Изменить это:

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

В ваших условиях вы проверяете (i + 1), (i + 2) во многих местах, где я могу перейти до файлаText.size() - 1. Это приведет к outofBound Array Exception.

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

Это очень просто. Вы пытаетесь получить доступ к полю вне суммы. Ваш последний символ прав, как '/', но вы пытаетесь получить доступ к другому, который недоступен. Смотрите строки кода ниже

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

Допустим, я = fileText.size() - 1 и что будет происходить в случае

fileText.get(i) // nothing all is fine 
fileText.get(i+1) // ??? occur exception IndexOutOfBound