Ich schreibe ein Programm, das eine Datei liest und dann prüft, ob es eine gleiche Anzahl von geschlossenen und offenen Klammern gibt. Also habe ich FileInputStream und die Scanner-Klasse benutzt, um die Datei zu lesen und jedes Zeichen in einer ArrayList zu speichern. Mein Programm arbeitet die meiste Zeit, wenn die gelesene Datei nicht mit einem Blockkommentar endet. Hier ist mein Code unten.Java ArrayList IndexOutOfBound beim Lesen von Kommentaren aus einer Datei
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;
}
Zum Beispiel, wenn ich versuche, {{}} /**/
zu lesen, die Fehler, die wir bekommen sind java.lang.IndexOutOfBoundsException: Index: 4, Size: 4 at java.util.ArrayList.rangeCheck(ArrayList.java:653) at java.util.ArrayList.get(ArrayList.java:429)
Es ist nicht wirklich ein Problem, da ich die meisten Dateien lesen kann, aber ich würde nur verstehen, warum mag. Bitte vergib mir auch, wenn ich eine Frage falsch gestellt habe, da dies meine erste Frage auf StackFlow ist. Vielen Dank.
Sie Schleife von 0 bis 'Länge passieren - 1 ', aber Sie haben 'fileText.get (i + 1)'. Dies wird die Grenzen des Arrays verlassen, da der maximale Array-Index "length-1" ist und Sie effektiv von 1 auf "length" gehen. – Moira