2017-02-11 1 views
0

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.

+0

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

Antwort

1

Ihre Kontrollen sind falsch:

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

Es ist nicht, dass die Kontrollen vollständig fehlen, sind aber die Bedingungen, von links nach rechts ausgewertet, so dass Ihr Zugriff auf fileText.get(i+1) geschieht vor die Prüfung auf die korrekte Länge wird ausgeführt.

Ändern Sie es an:

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

In Ihren Bedingungen überprüfen Sie (i + 1), (i + 2) an vielen Stellen, wo ich bis fileText.size() - 1 gehen kann. Dies führt zu OutofBound Array Exception.

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

Es ist sehr einfach. Sie versuchen, auf ein Feld außerhalb des Betrags zuzugreifen. Dein letzter Charakter ist richtig wie '/', aber du versuchst auf einen anderen zuzugreifen, der nicht verfügbar ist. Siehe Codezeilen unter

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

Sagen wir i = fileText.size() - 1 und was im Falle

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