簡體   English   中英

字符串索引超出界限異常錯誤

[英]String index out of Bounds Exception error

我正在編寫一個程序來讀取.java文件,並從中提取所有注釋,並將其寫入html文件。 該文件主要工作,但是我在提取每個方法的名稱時遇到了麻煩,因為它混淆了“ Exception {”作為單獨的類/方法。

到目前為止,這是我擁有的代碼,我相信它已經完成了。

http://pastebin.com/qrbJAaW3

    public class ParseDoc {

            static String fileName = null;
            static String outputR = "";
            static String inputR = "";
            static String[] lines;
            static String [] classnames;
            static StringBuilder classn = new StringBuilder();
            static String classnam = "";
            /**
             * This Method asks the user for path to input and output file
             * then it reads the file and places it on a string for easier sorting.
             * The string is sorted line by line into an array and cleaned.
             * @return Array of DOC comments
             * @throws Exception
             */
            public static String[] scanread() throws Exception{

                    System.out.println("NOTICE: If a valid file path is not entered, the program will not return a DOCHTML document.");
                    Scanner inputReader = new Scanner(System.in);
                    System.out.println("Please enter path to input file (ex: C:/Program Files/Code.java : " );
                    inputR = inputReader.nextLine();

                    System.out.println("Please enter path to html output file (ex: C:/Program Files/Output.html : " );
                    outputR = inputReader.nextLine();
                    inputReader.close();


                            FileReader file = new FileReader(inputR);
                            BufferedReader reader = new BufferedReader(file);
                            String line = reader.readLine();
                            //NAME OF THE SOURCE FILE
                            int index = inputR.lastIndexOf("/");
                            fileName = inputR.substring(index + 1);



                            int z = 0;
                            //This loop turns the input file into an String for easier access
                            while (line!= null){
                                    line = reader.readLine();
                                    z += 1;
                            }
                            reader.close();
                            file.close();

                            FileReader file2 = new FileReader(inputR);
                            BufferedReader reader2 = new BufferedReader(file2);
                            String line2 = reader2.readLine();


                            lines = new String[z];

                            int j = 0;

                            while(line2 != null)
                                            {
                                                    line2 = line2.trim();

                                                    lines[j] = line2;
                                                    line2 = reader2.readLine();
                                                    j += 1;
                                            }


                            reader2.close();
                            file2.close();

                    return lines;
            }

            /**
             * Removes all the comments from the Array containing strings
             * @param lines contains strings made of input file
             * @return Array with removed strings
             */
            public static String[] removeComments(String[] lines){


                    for (int i=0; i <lines.length;i++){
                            if (lines[i].startsWith("//"))
                            {
                                    lines[i]="";
                            }
                    }
                    return lines;

            }


            /**
             * This method scans the entire code for name of the classes and methods
             * along with their parameters and stores them in an Array for further use
             * @param lines
             * @return lines array without changing any content
             */
            public static String[] classNames(String[] lines)
            {

                    int total = 0;
                    String[] matches = new String[] {"public ", "class ","private "};

                    for(int b = 0; b <lines.length;b++)
                    {
                            Matcher num = Pattern.compile("\\S+\\s*\\(([^)]*)\\)").matcher(lines[b]);
                            for (int n = 0; n < 3 ;n++)
                            {
                                    if (lines[b].contains(matches[n]))
                                    {
                                            while(num.find())
                                            {
                                                    total += 1;
                                            }
                                    }
                            }
                    }
                    classnames = new String[total];

                    for(int z = 0; z<lines.length;z++)
                    {
                            Matcher mzz = Pattern.compile("\\w+\\s*\\{").matcher(lines[z]);
                            for (int k = 0; k < 3; k++)
                            {
                              if (lines[z].contains(matches[k])&& !(lines[z].contains("throws "))) //&& !(lines[z].contains("throws "))
                              {                            
                                              while(mzz.find())
                                              {            
                                                     classn.append( mzz.group()+"break");
                                              }
                              }
                            }

                    }

                    for(int z = 0; z <lines.length;z++)
                    {
                            //This matcher with Regex looks for class/method names along with any parameters inside
                            Matcher m = Pattern.compile("\\S+\\s*\\(([^)]*)\\)").matcher(lines[z]);
                            int i = 0;
                            for (int k = 0; k < 3; k++)
                            {
                              if (lines[z].contains(matches[k]) )
                              {                            
                                              while(m.find())
                                              {    
                                                     classn.append( m.group()+"break");
                                                    continue;

                                              }

                                    }

                            }
                    }

                    classnam = classn.toString();
                    classnames = classnam.split("break");
                    /*for(int step = 0; step<classnames.length;step++)
                    {
                            System.out.println(classnames[step]);
                    }*/
                    return lines;
            }




            /**
             * This method removes all the code from the Array and leaves on the
             * Doc comments intact.
             * @param lines
             * @return lines array with only comments remaining ( code is removed )
             */

            public static String[] removeCode(String[] lines)
            {
                    int rep = 0;
                    while ( rep <lines.length){
                lines[rep] = lines[rep].replaceAll("\\*", "Z");
                            if(!(lines[rep].startsWith("Z") || (lines[rep].startsWith("/")))){
                                    lines[rep]="";
                            }
                            lines[rep] = lines[rep].replaceAll("Z", "\\*");
                            rep += 1;
                    }



                    for(int num = 0; num <lines.length; num++)
                    {
                            if(lines[num].isEmpty()){
                                    lines[num] = null;
                            }
                    }

                    return lines;
            }



            /**
             * This method removes the remaining stars, slashes and properly formats each comment
             * before printing it.
             * @param lines The array contains parsed Java Doc comments
             * @return
             * @throws Exception
             */
            public static String[] writeTo(String[] lines) throws Exception
            {
                    BufferedWriter outputWriter = null;
                    outputWriter = new BufferedWriter(new FileWriter(outputR));
                    StringBuilder writeTo = new StringBuilder();
                    writeTo.append("<html>\n<body>\n<h2><mark> JAVA DOC COMMENTS</mark> </h2>\n<pre>\n"
                                                                    +"<big><b>Source File:</b> </big>" +"<big>"+ fileName+"</big>" + "\n\n");

                    for(int step = 0; step<lines.length;step++)
                    {
                            if(!(lines[step] == null))
                            {
                            lines[step] = lines[step].replace("@author", "<b>Author: </b>\n&nbsp&nbsp&nbsp");      
                            lines[step] = lines[step].replace("@since", "<b>Since: </b>\n&nbsp&nbsp&nbsp");
                            lines[step] = lines[step].replace("@version", "<b>Version: </b>\n&nbsp&nbsp&nbsp");
                            lines[step] = lines[step].replace("@param", "<b>Parameter: </b>\n&nbsp&nbsp&nbsp");
                            lines[step] = lines[step].replace("@return", "<b>Return: </b>\n&nbsp&nbsp&nbsp");
                            //lines[step] = lines[step].replace("*", "");
                            }
                    }




                    outputWriter.write(writeTo.toString());

                    //write to HTML
                    int countz = 0;
                    int comcount = 0;

                    //classnames[]
                    for(int resum = 0; resum<lines.length;resum++)
                    {

                            if(lines[resum] != null)
                            {
                                    if( lines[resum].charAt(0) == '*' )
                                    {
                                            lines[resum] = lines[resum].replace("*","");
                                    }


                            }
                    }
                    for(int i = 0; i < classnames.length; i++)
                    {
                            System.out.println(classnames[i]);
                    }

                    for(int resum = 0; resum<lines.length;resum++)
                    {
                            if(lines[resum] != null)
                            {

                                    if( lines[resum].charAt(0) == '/' )
                                    {
                                            if(lines[resum].endsWith("*"))
                                            {
                                            lines[resum] = lines[resum].replace("/**","<b>"+classnames[countz]+"</b>");
                                            countz++;
                                            }
                                    }

                                    if( lines[resum].charAt(0) == '/' )
                                    {

                                            lines[resum] = lines[resum].replace("/","\n");

                                    }      
                            }
                    }

                    /*for(int resum = 0; resum<lines.length;resum++)
                    {

                    }*/






                    for(int f = 0; f<lines.length;f++)
                    {
                            if(lines[f] != null)
                            {

                                    /*if(lines[f].startsWith("//") && lines[f].length() == 2)
                                    {
                                            lines[f] = "TEEEST";
                                            countz++;
                                    }*/



                                    outputWriter.write(lines[f]+"\n");

                            }

                    }






                    outputWriter.close();
                    return null;
            }


    }

安慰:

Please enter path to input file (ex: C:/Program Files/Code.java : 
I:\ICS4U0\DocParse\src\java_doc_parse\ParseDoc.java
Please enter path to html output file (ex: C:/Program Files/Output.html : 
I:\ICS4U0\DocParse\src\java_doc_parse\ParseDochh.html
ParseDoc {
scanread()
removeComments(String[] lines)
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 0
    at java.lang.String.charAt(Unknown Source)
    at java_doc_parse.ParseDoc.writeTo(ParseDoc.java:285)
    at java_doc_parse.Execute.main(Execute.java:14)
classNames(String[] lines)
removeCode(String[] lines)
writeTo(String[] lines)

我不確定是什么導致此錯誤。 有沒有辦法解決它,還是我應該完全放棄在注釋中添加類名?

抱歉,如果我缺少一些信息,但是我很困惑。

該錯誤似乎是因為您在似乎是空字符串的地方調用了charAt(0)。

上面您已經有一個null檢查,我不知道它是否有效(您的行是否可以為null?),但是我會將其更改為一個長度檢查,可能與現有的null檢查結合使用。

if (lines[resum] != null && lines[resum].length > 0) {

我認為這是您的錯誤所在:

 for(int resum = 0; resum<lines.length;resum++)
            {
                    if(lines[resum] != null)
                    {

                            if( lines[resum].charAt(0) == '/' )
                            {
                                    if(lines[resum].endsWith("*"))
                                    {
                                    lines[resum] = lines[resum].replace("/**","<b>"+classnames[countz]+"</b>");
                                    countz++;
                                    }
                            }

                            if( lines[resum].charAt(0) == '/' )
                            {

                                    lines[resum] = lines[resum].replace("/","\n");

                            }      
                    }
            }

嘗試以下操作,在進入for循環之前移動null檢查:

 if(lines[0] != null)
 {
 for(int resum = 0; resum<lines.length;resum++)
            {


                            if( lines[resum].charAt(0) == '/' )
                            {
                                    if(lines[resum].endsWith("*"))
                                    {
                                    lines[resum] = lines[resum].replace("/**","<b>"+classnames[countz]+"</b>");
                                    countz++;
                                    }
                            }

                            if( lines[resum].charAt(0) == '/' )
                            {

                                    lines[resum] = lines[resum].replace("/","\n");

                            }      
                    }
            }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM