2011-09-13 55 views
0

我有下面的代码从文件读取数据并将其存储在一个字符串变量,现在当我运行它,它给了我一个字符串越界异常。我该如何解决这个错误?为什么我得到一个字符串越界异常

运行命令和错误:

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代码..所以你不能识别是(true); (假);在一行中作为两个ifs;)你将只计算一个。 –

回答

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 - (长度 - 1)这意味着charAt(i)是好的。然而,你做i ++并做另一个charAt(i)。所以当i ==长度-1,charAti ++会引起异常。

+0

我该如何解决这个问题呢?我需要查看字符串中的所有字符。 – josh

+0

你可以在** ** ++ **之后检查** i

+1

将它与字符串的长度比较,然后将其加一。 (if(compareString.length()<= i)break;)更好的方法可能是让主循环只返回compareString.length() - 3(因为循环的内容在结尾附近不相关) 。 – Rontologist

0

您的代码中存在一堆问题。例如。当你做这样的事情:

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

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

你正在拍摄自己的脚。当我指向这里的最后一个字符时,你会在第二个if中得到一个错误。我强烈劝阻这种嵌套的“if”检查你想要做什么。它可能是代码中无限的错误来源。看看“开关”声明:

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

您的for循环默认情况下失败。如果你达到';'例如:'if(true);'你然后增加我并测试下一个字符是否不是'我'..这显然抛出OoB异常,因为你问的索引大于string.length - 1;