Я пишу программу, которая читает файл, а затем проверяет, существует ли равное количество закрытых и открытых скобок. Таким образом, я использовал 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 до 'длина - 1', но у вас есть 'fileText.get (i + 1)'. Это выйдет за пределы массива, так как максимальный индекс массива будет 'length - 1', и вы эффективно переходите от 1 до' length'. – Moira