2017-02-11 8 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

あなたの条件では、私はfileText.size() - 1まで行くことができる多くの場所で(i + 1)、(i + 2)をチェックしています。これによりoutofBound配列例外が発生します。

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

それは非常に簡単です。あなたは額の外のフィールドにアクセスしようとします。あなたの最後の文字は '/'のように正しいですが、利用できない他の文字にアクセスしようとします。 )fileText.size(=

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

以下のコード行はのは、私を言ってみましょう参照してください - 1とどのような場合

fileText.get(i) // nothing all is fine 
fileText.get(i+1) // ??? occur exception IndexOutOfBound 
関連する問題