2011-09-13 12 views
0

ファイルからデータを読み込んでString変数に格納する次のコードがあります。実行すると、文字列の範囲外の文字列が返されます。このエラーを修正するにはどうすればよいですか?文字列の範囲外の例外を取得する理由

runコマンドとエラー:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 1882 
    at java.lang.String.charAt(String.java:694) 
    at IfCounter2.main(IfCounter2.java:92) 

コード:

import java.io.*; 

public class IfCounter2 
{ 
    // method to check if there is a single-line comment 
    public static boolean lineAComment(String line) 
    { 
     if (line.contains("//")) 
      return true; 

     return false; 
    } 

    // method to check if there is a multi-line comment start 
    public static boolean multiLineCommentStart(String line) 
    { 
     if (line.contains("/*")) 
      return true; 

     return false; 
    } 

    // method to check if there is a multi-line comment end 
    public static boolean multiLineCommentEnd(String line) 
    { 
     if (line.contains("*/")) 
      return true; 

     return false; 
    } 

    public static void main(String[] args) throws IOException 
    { 
     // variable to keep track of ifs 
     int ifCount = 0; 
     // check how many arguments are passed 
     int numArgs = args.length; 

     // look at all the arguments 

     // they don't want to count ifs in comments ************************************ --nocomment was entered 
     if (args[0].equals("--nocomments")) 
     { 
      // create a new BufferReader for the file that will be at args 1 
      BufferedReader reader = new BufferedReader(new FileReader (args[1])); 
      String line = null; 
      StringBuilder stringBuilder = new StringBuilder(); 
      String ls = System.getProperty("line.separator"); 

      // read from the text file 
      boolean multiLineComment = true; 

      // ignore comments as we store data in a String variable 
      while ((line = reader.readLine()) != null) 
      { 
       if (!multiLineCommentStart(line)) 
       { 
        multiLineComment = true; 
       } // end if 

       if (multiLineComment) 
       { 
        if (!multiLineCommentEnd(line)) 
        { 
         multiLineComment = false; 
        } // end if 
       } // end if 

       if (!lineAComment(line) && !multiLineComment) 
       { 
        stringBuilder.append(line); 
        stringBuilder.append(ls); 
       } // end if 
      } // end while 

      // create a new string with stringBuilder data 
      String tempString = stringBuilder.toString(); 
      System.out.println(tempString); 

      // create one last string to look for our valid if(s) in, 
      // with ALL whitespace removed 
      String compareString = tempString.replaceAll("\\s",""); 
      //System.out.println(compareString); 

      for (int i = 0; i < compareString.length(); i++) 
      { 

       if (compareString.charAt(i) == ';' || compareString.charAt(i) == '}' || compareString.charAt(i) == '{' || compareString.charAt(i) == '\n') 
       { 
        i++; 

        if (compareString.charAt(i) == 'i') 
        { 
         i++; 

         if (compareString.charAt(i) == 'f') 
         { 
          i++; 

          if (compareString.charAt(i) == '(') 
           ifCount++; 
         } // end if 
        } // end if 
       } // end if 

      } // end for 

     } // end if (comments option) 

     // else ******************************************************** count ifs as usual 
     /*else 
     { 
      for (int c = 0; c <= numArgs; c++) 
      { 
       // create a new BufferReader 
       BufferedReader reader2 = new BufferedReader(new FileReader (args[c])); 
       String line2 = null; 
       StringBuilder stringBuilder2 = new StringBuilder(); 
       String ls2 = System.getProperty("line.separator"); 

       // read from the text file 
       while ((line2 = reader2.readLine()) != null) 
       { 
        stringBuilder2.append(line2); 
        stringBuilder2.append(ls2); 
       } 

       // create a new string with stringBuilder data 
       String tempString2 = stringBuilder2.toString(); 

       // create one last string to look for our valid if(s) in 
       // with ALL whitespace removed 
       String compareString2 = tempString2.replaceAll("\\s",""); 

       // check for valid if(s) 
       for (int i = 0; i < compareString2.length(); i++) 
       { 
        if (compareString2.charAt(i) == ';' || compareString2.charAt(i) == '}' || compareString2.charAt(i) == '{') // added opening "{" for nested ifs :) 
        { 
         i++; 

         if (compareString2.charAt(i) == 'i') 
         { 
          i++; 

          if (compareString2.charAt(i) == 'f') 
          { 
           i++; 

           if (compareString2.charAt(i) == '(') 
            ifCount++; 
          } // end if 
         } // end if 
        } // end if 

       } // end for 
      } // end if (else option) 
     } // end for 
*/  
     // print the number of valid "if(s) with a new line after" 
     System.out.println(ifCount + "\n"); 

    } 
} 
+1

デバッガを使用し、92行目にブレークポイントを設定しようとしましたか?そこから変数を調べて、 'charAt'に渡すインデックスが無効な理由を正確に判断できます。 –

+0

行92にはどの行のコードがありますか? –

+0

私はこのコードの目的が分かりませんが、明らかに間違っています。 Javaコードを解析する必要がある場合、if(真)を認識できません。 if(false); 1つの行に2つのifs;として)あなたは1つのために数えます。 –

答えて

5
for (int i = 0; i < compareString.length(); i++) 
     { 

      if (compareString.charAt(i) == ';' || compareString.charAt(i) == '}' || compareString.charAt(i) == '{' || compareString.charAt(i) == '\n') 
      { 
       i++; 

       if (compareString.charAt(i) == 'i') 

上記のコードは、あなたの問題です。 0 - (length - 1)これは、charAt(i)がokであることを意味します。しかし、i ++を実行し、別のcharAt(i)を実行します。だからi ==長さ-1charAtの後にi ++が例外となります。

+0

これはどうすれば修正できますか?私は文字列内のすべての文字を調べる必要があります。 – josh

+0

** i ++を実行した後、** i

+1

文字列の長さにiを1つ増やした後にiを比較します。あなたのメインループをcompareString.length() - 3(ループの内容が最後の近くにあるため)に移動させるのが良い方法かもしれませんが、 。 – Rontologist

0

あなたのコードにはいくつかの問題があります。例えば。あなたがこのようなことをするとき:

if (compareString.charAt(i) == 'i') 
    { 
     i++; 

     if (compareString.charAt(i) == 'f') 
     { 

あなたは足で自分を撃っています。ここで最後の文字を指していると、2番目のifでエラーが発生します。私はあなたがしようとしているものについて、この種のネストされた "if"チェックを強く控える。コード内に無限のバグの原因となることがあります。

switch(compareString.charAt(i)) { 
    case 'i': 
     // do something 
     break; 
    case 'f': 
     // do something else 
     break; 
} 
1

forループは、デフォルトで失敗します。あなたが ';'に達すると例えば、行の最後に: 'if(true);'次の文字が '私'でない場合は、iを増やしてテストします。string.length - 1より大きいインデックスについて質問しているので、明らかにOoB例外がスローされます。

関連する問題